问题背景
在 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 可以快速完成复杂的调用过程, 这个过程就是利用数据进行驱动的.
来源: https://www.cnblogs.com/future-dream/p/11917926.html