用户在使用某个脚本文件时是可以输入参数的。
$# : 用户输入参数的个数
$n : 用户输入的第N个参数,如果没有则这个变量是空值,n是一个具体的数值
$* : 把用户输入的所有参数构成一个字符串,被当成一个字符串
$@ : 与前面结果一样,但是可以使用for来迭代。
shift :这是一个命令,将最前面的参数移位掉,移位之后的参数不能恢复。
以上是得到用户输入参数的值,值的个数,以及对参数的使用。
我们一般把输入的参数分2种,选项和参数,比如ls -f这里的-f就是一个选项,它以-开头,处理这样的情况就要使用到case语句。
这里有一个规则,选项是-开头,选项和参数之前用--分隔。
比如 ./test -a -- b
这里a就是选项,b就是参数
还有,选项是可以带值的。
比如 ./test -a b -- c d
这里a是选项,b是选项的值,c 和 d 分别是2个参数。
我们还需要达到一个效果,-ab ,这是ab2个选项,这么输入我们要把他当成2个选项来处理,以目前的情况似乎无法处理,所以需要借助命令getopt来帮助我们处理。
这个命令可以把用户输入参数变成我们想要的格式,也就是符合前面的规则
getopt的使用方法:只需要在脚本处理参数之前加上 set -- `getopt -q ab:c "$@"`
这句话的意思就是把$@变成符合规则的形式,-q表示不输出错误信息。因为,如果我的case语句里面只处理了ab2个选项,但是我输入的参数还包括了c选项就会报错。如果加了-q 参数就不会报这个错误信息。
但是这个命令有一个bug,就是./test -a "value1 value2"
这样它就会把"value1 value2"当成2个参数,这个命令处理不了带空格的参数。这时需要使用更高级的命令getopts
getopts的使用方法
对于这个,我只知道输入的选项可以带一个参数。带多个参数需要自行处理代码
带不带参数是自己决定的,使用$OPTARG输出参数。
最重要的是这个解决了前面参数带空格的问题。
还有一个补充是这个命令会把不能识别的参数打出一条语句表示。如果输入了c选项,他会打印一条默认输出的语句,也就是*里面执行的语句,并且$opt=?