当你使用一个命令时,通过--help就可以看到有很多种功能。
例如ls
当你敲下
ls -a
ls -lths
... 这都是如何解析的呢?
mysql命令 多数选项是包含参数的,这又是如何解析的呢?
位置参数变量是标准的数字: $0是程序名, $1是第一个参数, $2是第二个参数,依次类推,直到第九个参数$9。
如果超过10个参数,必须在变量数字周围加上花括号,比如${10}
例如:
#/bin/bash total=$[ ${10} * ${11} ] echo "The tenth parameter is ${10}" echo "The 11th parameter is ${11}" echo "Total is $total"
echo "The shell name is $0"
看起来有点别扭,如何脚本的运行路径给剥离掉?
basename命令会返回不包含路径的脚本名。
#/bin/bash name=$(basename $0) echo "The shell name is: $0" echo "The shell name is: $name"
#!/bin/bash name=$(basename $0) if [ $name = "addem" ];then total=$[ $1 + $2 ] elif [ $name = "multem" ];then total=$[ $1 * $2 ] fi echo echo Toal is : $total
结果:
当漏掉一个参数的时候,会报错。如何引导使用脚本的人正确使用呢?
chapter14]# bash multem 10 multem: line 8: 10 * : syntax error: operand expected (error token is "* ") Toal is :
结果:
如果是只有一个字符串参数,可以使用-n 判断该字符串是否为空。
if [ str1 = str2 ] 当两个串有相同内容、长度时为真 (等号两边有空格) if [ str1 != str2 ] 当串str1和str2不等时为真 if [ -n str1 ] 当串的长度大于0时为真(串非空) if [ -z str1 ] 当串的长度为0时为真(空串) if [ str1 ] 当串str1为非空时为真
获取变量列表的最后一个参数:
${!#}
不是${$#}
#!/bin/bash # date 2021年12月30日11:00:12 # desc 位置参数 parameter=$# echo "The Total parameters is: $#" echo "The last parameters is: ${!#}" echo "The last parameters is: ${$#}"
$#的值为0,params变量的值也一样,但${!#}变量会返回命令行用到的脚本名。
$*变量会将命令行上提供的所有参数当作一个单词保存
$@变量会将命令行上提供的所有参数当作同一字符串中的多个独立的单词。
看一个例子就清楚了
#!/bin/bash # test $@ and $* #echo "output \$*: $*" #echo "output \$@: $@" count=1 for item in "$*";do echo "\$* Item #$count: $item" count=$[ $count + 1 ] done echo count=1 for item in "$@";do echo "\$@ Item #$count: $item" count=$[ $count + 1 ] done ~ ~
要点:
使用shift只操作第一个参数,移动参数,然后继续操作第一个参数。
#!/bin/bash count=1 while [ -n "$1" ];do echo "paramerer #$count: $1" count=$[ $count + 1 ] shift done ~