• 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
    ",a[0] +a[1] +a[2]);
        ret = atoi(buf);
        if (ret){
            printf("command execute succeed!
    ");
        } else {
            printf("command execute fail!
    ");
        }
        return 0;
    }

    结果

    从上述的代码我们就实现从c语言中输入参数给shell,在将shell输出的参数获取到进行一个处理。最后可以将这个写入shell作为一个脚本

    三、总结

    介绍了如何在将命令行的参数给shell,c语言如何获取shell的参数,在用shell将其封装起来。内容类似递归,但是在我们实际使用中很重要。我们需要在一段代码中引入其他语言的内容,就会出现由于编译器的问题无法解析这段代码,此时我们就需要利用命令行来完成这段代码的解析。举一个例子在web开发中,利用PHP搭建一个web后端,但是由于数据处理方面PHP并不是很适合,此时我们使用的是python,因为无法直接在PHP中对python语法进行编译运行,就需要使用命令行调用python文件,获取输出结果(如下图)。这就是一个很常见的应用场景之一。shell调用c也是一样的,将其封装起来,使用shell可以快速完成复杂的调用过程,这个过程就是利用数据进行驱动的。

  • 相关阅读:
    决定你人生高度的,不是你的才能,而是你的态度
    享受六一的最后几分钟
    DB9 公头母头引脚定义及连接
    bzoj3207--Hash+主席树
    bzoj1901 [ Zju2112 ] --树状数组套主席树
    bzoj1723 [ Usaco2009 Feb ] --前缀和(水题)
    bzoj3932 [ CQOI2015 ] --可持久化线段树
    bzoj3037--贪心
    bzoj3388 [ Usaco2004 Dec ] (神奇的解法)
    bzoj2693--莫比乌斯反演+积性函数线性筛
  • 原文地址:https://www.cnblogs.com/future-dream/p/11917926.html
Copyright © 2020-2023  润新知