shell中的特殊参数
1. 位置参数
$ 变量名
#!/bin/bash
echo $1 #接收一个参数并输出
#!/bin/bash
echo $1,$2 #接收两个参数并输出
注意:
1.有一个$符只能接收一个参数,后面输入的不会被接收
2.如果用双引号括起来代表一个参数。例如:“hello word”
多个位置参数
脚本:
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
执行:
位置参数的数字大于9后,输出的内容就不对了。这是因为解释器把10当作1和0两个数字来看。
当位置参数的数字大于9时:需要用花括号将数字括起来
改写后的脚本:
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
执行:
2. 获取脚本的名称及路径
2.1 $0获取
echo $0
用$0来获取时:
若不带路径执行脚本,那么输出结果就是脚本的名字;
若使用全路径执行脚本,那么输出结果就是全路径加上脚本名
2.2 单独获取名称和路径
#!/bin/bash
dirname $0 #获取路径
basename $0 #获取脚本名
若不带路径执行脚本,输出的结果为".",代表当前路径
若带路径执行脚本,输出的结果为路径名
3. $#获取脚本传参的个数
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo $# # $#获取脚本传参的个数
传递了a到z 26个参数,但是只接收了9个变量,所以打印9个字符
4. set设置位置参数
set -- 参数
5. $* 和 $@的区别
在Shell中, $*和 $@都表示参数列表中的所有参数,它们在具体使用中会有哪些不同呢?
#!/bin/bash
foo(){
echo $*
}
bar(){
echo $@
}
foo 1 2 3 4
bar 1 2 3 4
输出没有任何区别,那么 $* 和 $@ 的区别到底是什么呢?
当 $* 和 $@ 被双引号(" ")包含时, $* 会将所有的参数作为一个整体,以” $1 $2 … $n “ 的形式输出所有参数。
而 $@ 会将各个参数分开,以” $1 “ " $2 " … " $n "的形式输出所有参数。
#!/bin/bash
test(){
echo "未加引号,二者相同"
echo $*
echo $@
echo "加入引号后对比"
echo "-------"
for N in "$*"
do
echo $N
done
echo "########"
for N in "$@"
do
echo $N
done
}
test 11 22 33
由此可见:
$*输出的格式为" $1 $2 $3 "
$@输出的格式为"$1" “$2” “$3”
6. shift用于参数的移动
shift命令用于对于参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理
#!/bin/bash
while [ $# != 0 ];do
echo "第一个参数为:$1,参数的个数为:$#"
shift
done
shift命令每执行一次,变量的个数($#)减1;之前的$1变量被销毁,之后的$2就变成了$1,而变量值提前一位
7. $?获取函数的返回值
当一个进程执行完毕时,该进程会提供一个退出码(一个整数)表明它准备退出的原因。按照惯例,0用来表明正常或者说“成功”的终止。也就是说我们在执行echo $?时返回的值就是进程的退出码,这个退出码是由刚刚执行完的进程提供给系统内核的。
$?是一个特殊变量,同来获取上一个命令的退出状态,或者上一个函数的返回值。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下大部分命令执行成功会返回0,失败返回1,这和c语言中的main()函数是类似的。
理解函数的返回值:
应用:判断参数是否正确
#!/bin/bash
if [ "$1" == 100 ]
then
exit 3 #参数正确 退出状态为0
else
exit 1 #参数不正确 退出状态为1
fi
应用:$? 获取函数的返回值
#!/bin/bash
add(){
return `expr $1 + $2`
}
add 23 50 #调用函数
echo $?