c獲取shell中的參數

問題背景python

在Linux中咱們會使用到shell,來完成輸入參數的獲取,就如同下面的形式,這種形式在進行多語言編程和調用有着很是重要的做用web

sh test_params 9 8 7

1、傳遞的過程shell

1.1 原理模型以下:編程

1.1.1 可執行sh文件中調用C文件後端

1.1.2 可執行c文件中調用sh文件spa

1.2 從shell調用c命令行

 根據上述的模型能夠知道,經過在shell中加入c程序的編譯運行命令,如[gcc -o filename filename.c]來完成編譯,使用命令[./filename]來進行調用3d

代碼:code

下面的代碼就是運行編譯後的hello.c產生的hello文件和對new.c文件的編譯和運行,new.c中是一個輸入三個數實現求和運算blog

echo ./hello gcc -o new new.c ./new

結果:

1.3 從c中調用shell

使用讀取shell的文件來完成數據的獲取

if((stream = popen("sh test_adjust.sh", 'r')) == NULL){ fprintf(stderr, "%s", strerror(errno)); return -1; } int i = 0; while (fgets(buf, sizeof(buf), stream) != NULL){ a[i] = (int)buf[0] - 48; i++; }

2、 帶有參數的傳遞

在c中調用sh文件獲取參數以前,先讓sh從命令行獲取參數

2.1 shell獲取參數

shell腳本的參數傳遞,經過$+n來獲取第幾個參數,0是特殊的參數,是獲取腳本的名稱

代碼:

echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $12
echo $123
echo $1235

結果:

 

2.1.1 不輸入參數的調用

在shell中使用$0——$n來獲取參數,0表明腳本,其餘的就是依次獲取參數,在不指定的狀況下會輸入減一位的值

2.1.2 參數輸入和位置獲取不對應

若是有輸入就要和位置對應起來,不然會默認輸出$後面的值

2.1.3 按位置輸入獲取

按照對應的位置輸入就會出現對應位置的值

2.2 利用c調用shell命令獲取shell的參數

上述講述瞭如何利用[sh <filename>.sh param_0 param_1 ... ]來獲取命令行對sh文件的參數輸入獲取,在c中如何進行調用sh腳本,代碼以下

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h>
int main(){ char buf[1024]; FILE *stream = NULL; int a[1024]; int ret; memset(buf, 0, sizeof(buf)); if((stream = popen("sh test_adjust.sh 3 5 8", 'r')) == NULL){ //關鍵位置 fprintf(stderr, "%s", strerror(errno)); return -1; } int i = 0; while (fgets(buf, sizeof(buf), stream) != NULL){ a[i] = (int)buf[0] - 48; // 扣掉的48是0的ASCII碼 i++; } printf("the sum of number:%d\n",a[0] +a[1] +a[2]); ret = atoi(buf); if (ret){ printf("command execute succeed!\n"); } else { printf("command execute fail!\n"); } return 0; }

結果

從上述的代碼咱們就實現從c語言中輸入參數給shell,在將shell輸出的參數獲取到進行一個處理。最後能夠將這個寫入shell做爲一個腳本

3、總結

介紹瞭如何在將命令行的參數給shell,c語言如何獲取shell的參數,在用shell將其封裝起來。內容相似遞歸,可是在咱們實際使用中很重要。咱們須要在一段代碼中引入其餘語言的內容,就會出現因爲編譯器的問題沒法解析這段代碼,此時咱們就須要利用命令行來完成這段代碼的解析。舉一個例子在web開發中,利用PHP搭建一個web後端,可是因爲數據處理方面PHP並非很適合,此時咱們使用的是python,由於沒法直接在PHP中對python語法進行編譯運行,就須要使用命令行調用python文件,獲取輸出結果(以下圖)。這就是一個很常見的應用場景之一。shell調用c也是同樣的,將其封裝起來,使用shell能夠快速完成複雜的調用過程,這個過程就是利用數據進行驅動的。

相關文章
相關標籤/搜索