c獲取shell中的參數


問題背景

在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可以快速完成復雜的調用過程,這個過程就是利用數據進行驅動的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM