当你使用一个命令时,通过--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移动命令
要点:
- 默认情况下它会将每个参数变量向左移动一个位置(可以使用shift n 每次移动n个位置)
- 例如变量$2的值会移到$1中,而变量$1的值则会被删除。
在不知道参数数量的前提下如何遍历参数列表?
使用shift只操作第一个参数,移动参数,然后继续操作第一个参数。
#!/bin/bash
count=1
while [ -n "$1" ];do
echo "paramerer #$count: $1"
count=$[ $count + 1 ]
shift
done
~