Linux命令的选项和参数的区别,Shell命令的选项和参数在本质
上是什么?
很多 Shell 命令都是可以附带选项和参数的,不同的选项和参数也使得命令的功能细节有所差异。
Shell 命令附带参数的例⼦:
cd demo命令表⽰进⼊当前⽬录下的 demo ⽬录,其中demo就是 cd 命令的参数。
echo "123xyz"命令表⽰输出字符串并换⾏,其中"123xyz"就是 echo 命令的参数。
Shell 命令附带选项的例⼦:
ls -l命令⽤来显⽰当前⽬录下的所有⽂件以及它们的详细信息,其中-l就是 ls 命令的选项。
echo -n "c.biancheng/shell/"表⽰在输出字符串后不换⾏,其中-n是 echo 命令的选项,"c.biancheng/shell/"是echo 命令的参数。
有些命令的选项后⾯也可以附带参数:
getsum -s 1 -e 100命令⽤来计算从 1 累加到 100 的和,其中-s和-e是 getsum 命令的选项,1和100分别是-s和-e选项的参数。
read -n 1 sex命令⽤来读取⼀个字符并赋值给 sex 变量,其中-n是 read 命令的选项,1是-n选项的参数,sex是 read 命令的参数。
你是否对这些形形⾊⾊的选项和参数感到好奇?你是否想知道它们在底层是如何实现的?你是否也想⾃⼰动⼿对它们进⾏解析?本节就来给你揭晓答案!
死磕这个细节并不是闲得⽆聊,它能帮助我们理解命令的真正含义。好了,废话不多说,让我们赶紧转⼊正题吧。
上节我们讲到,⼀个 Shell 内置命令就是⼀个内部的函数,⼀个外部命令就是⼀个应⽤程序。内置命令后⾯附带的所有数据(所有选项和参数)最终都以参数的形式传递给了函数,外部命令后⾯附带的所有数据(所有选项和参数)最终都以参数的形式传递给了应⽤程序。
也就是说,不管是内置命令还是外部命令,它后⾯附带的所有数据都会被“打包”成参数,这些参数有的传递给了函数,有的传递给了应⽤程序。
shell命令属于什么语言有编程经验的读者应该知道,C语⾔或者 C++ 程序的⼊⼝函数是int main(int argc, char *argv[]),传递
给应⽤程序的参数最终都被 main 函数接收了。从这个⾓度看,传递给应⽤程序的参数其实也是传递给了函数。
有了以上认知,我们就不⽤再区分函数和应⽤程序了,我们就认为:不管是内置命令还是外部命令,它后⾯附带的数据最终都以参数的形式传递给了函数。实现⼀个命令的⼀项重要⼯作就是解析传递给函数的参数。
注意,命令后⾯附带的数据并不是被合并在⼀起,作为⼀个参数传递给函数的;这些数据是由空格分隔的,它们被分隔成了⼏份,就会转换成⼏个参数。例如getsum -s 1 -e 100要向函数传递四个参数,read -n 1 sex要向函数中传递三个参数。
并且,命令后⾯附带的数据都是“原汁原味”地传递给了函数,⽐如getsum -s 1 -e 100要传递的四个参数分别是 -s、1、-e、100,减号-也会⼀起传递过去,在函数内部,减号-可以⽤来区分该参数是否是命令的选项。
⾄于在函数内部如何解析这些参数,对于外部命令来说那就是 C/C++ 程序员的⼯作了,这⾥不再过多赘述,只给出演⽰代码。
上节我给⼤家演⽰了⼀个 getsum 程序,本节依然使⽤该程序演⽰参数的解析,只是对代码进⾏了微调。
#include
#include
#include
#include
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
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() 函数是值得重点研究的,有了该函数我们就不⽤⾃⼰去解析参数了,省了很⼤的⼒⽓。
第 27~32 ⾏将接收到的参数打印出来,以便读者更好地观察。
根据上节给出的办法就可以运⾏ getsum 命令:
[mozhiyan@localhost ~]$ getsum -s 1 -e 100

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。