問題背景
在Linux中我們會使用到shell,來完成輸入參數的獲取,就如同下面的形式,這種形式在進行多語言編程和調用有着非常重要的作用
sh test_params 9 8 7
一、傳遞的過程
1.1 原理模型如下:
1.1.1 可執行sh文件中調用C文件
1.1.2 可執行c文件中調用sh文件
1.2 從shell調用c
根據上述的模型可以知道,通過在shell中加入c程序的編譯運行命令,如[gcc -o filename filename.c]來完成編譯,使用命令[./filename]來進行調用
代碼:
下面的代碼就是運行編譯后的hello.c產生的hello文件和對new.c文件的編譯和運行,new.c中是一個輸入三個數實現求和運算
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++; }
二、 帶有參數的傳遞
在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作為一個腳本
三、總結
介紹了如何在將命令行的參數給shell,c語言如何獲取shell的參數,在用shell將其封裝起來。內容類似遞歸,但是在我們實際使用中很重要。我們需要在一段代碼中引入其他語言的內容,就會出現由於編譯器的問題無法解析這段代碼,此時我們就需要利用命令行來完成這段代碼的解析。舉一個例子在web開發中,利用PHP搭建一個web后端,但是由於數據處理方面PHP並不是很適合,此時我們使用的是python,因為無法直接在PHP中對python語法進行編譯運行,就需要使用命令行調用python文件,獲取輸出結果(如下圖)。這就是一個很常見的應用場景之一。shell調用c也是一樣的,將其封裝起來,使用shell可以快速完成復雜的調用過程,這個過程就是利用數據進行驅動的。