0
点赞
收藏
分享

微信扫一扫

Shell命令的选项和参数

大南瓜鸭 2022-01-04 阅读 35

很多 Shell 命令都是可以附带选项和参数的,不同的选项和参数也使得命令的功能细节有所差异。

Shell 命令附带参数的例子:

  • cd demo命令表示进入当前目录下的 demo 目录,其中demo就是 cd 命令的参数
  • echo "123xyz"命令表示输出字符串并换行,其中"123xyz"就是 echo 命令的参数。

Shell 命令附带选项的例子:

  • ls -l命令用来显示当前目录下的所有文件以及它们的详细信息,其中-l就是 ls 命令的选项
  • echo -n "http://c.biancheng.net/shell/"表示在输出字符串后不换行,其中-n是 echo 命令的选项,"http://c.biancheng.net/shell/"是 echo 命令的参数。

有些命令的选项后面也可以附带参数:

  • getsum -s 1 -e 100命令用来计算从 1 累加到 100 的和,其中-s-e是 getsum 命令的选项,1100分别是-s-e选项的参数。
  • read -n 1 sex命令用来读取一个字符并赋值给 sex 变量,其中-n是 read 命令的选项,1-n选项的参数,sex是 read 命令的参数。

不管是内置命令还是外部命令,它后面附带的数据最终都以参数的形式传递给了函数。实现一个命令的一项重要工作就是解析传递给函数的参数

注意,命令后面附带的数据并不是被合并在一起,作为一个参数传递给函数的;这些数据是由空格分隔的,它们被分隔成了几份,就会转换成几个参数。例如getsum -s 1 -e 100要向函数传递四个参数,read -n 1 sex要向函数中传递三个参数。

并且,命令后面附带的数据都是“原汁原味”地传递给了函数,比如getsum -s 1 -e 100要传递的四个参数分别是 -s、1、-e、100,减号-也会一起传递过去,在函数内部,减号-可以用来区分该参数是否是命令的选项。

至于在函数内部如何解析这些参数,对于外部命令来说那就是 C/C++ 程序员的工作了,这里不再过多赘述,只给出演示代码。

下边给大家演示一个 getsum 程序,使用该程序演示参数的解析。

#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    int start = 0;
    int end = 0;
    int sum = 0;
    int opt;
    char *optstring = ":s:e:";

    //分析接收到的参数
    while((opt = getopt(argc, argv, optstring))!= -1){
        switch(opt){
            case 's': start = atoi(optarg); break;
            case 'e': end = atoi(optarg); break;
            case ':': puts("Missing parameter"); exit(1);
        }
    }
   
    //检测参数是否有效
    if(start<0 || end<=start){
        puts("Parameter error"); exit(2);
    }
   
    //打印接收到的参数
    printf("Received parameters: ");
    for(int i=0; i<argc; i++){
        printf("%s  ", argv[i]);
    }
    printf("\n");
   
    //计算累加的和
    for(int i=start; i<=end; i++){
        sum+=i;
    }
    printf("sum=%d\n", sum);

    return 0;
}

第 11~20 行是解析参数的关键代码,getopt.h 头文件中的 getopt() 函数是值得重点研究的,有了该函数我们就不用自己去解析参数了,省了很大的力气。

举报

相关推荐

0 条评论