参数介绍:
$0 获取脚本名
$1 脚本后第一个参数
$2 脚本后第二个参数
$3 脚本后第三个参数
${10} 脚本后第十个参数
$# 脚本后追加参数个数
$* 接收所有位置参数
$@ 接收所有位置参数
$$ 获取当前进程PID号
$? 上一个命令是否执行成功,0是正确,其它都是错误
$*和$@获取位置参数有啥区别呢?
当传输多个参数,都是以空格作为分隔符的时候,获取每一个元素,此时这两个参数没有什么区别
如果使用for循环区分为"$*" 和$@区别
当$*和$@这俩特殊变量,都没有添加引号
cat >test.sh <<'EOF'
echo "----------------测试\$*,且无引号--------------"
for v in $*
do
echo "传入的位置参数,分别是${v}"
done
echo "----------------测试\$@,且无引号--------------"
for v in $@
do
echo "传入的位置参数,分别是${v}"
done
EOF
[root@nginx ~]# bash test.sh 1 2 3 4 5
----------------测试$*,且无引号--------------
传入的位置参数,分别是1
传入的位置参数,分别是2
传入的位置参数,分别是3
传入的位置参数,分别是4
传入的位置参数,分别是5
----------------测试$@,且无引号--------------
传入的位置参数,分别是1
传入的位置参数,分别是2
传入的位置参数,分别是3
传入的位置参数,分别是4
传入的位置参数,分别是5
for循环中加上引号
echo "----------------测试\$*,且无引号--------------"
for v in "$*"
do
echo "传入的位置参数,分别是${v}"
done
echo "----------------测试\$@,且无引号--------------"
for v in "$@"
do
echo "传入的位置参数,分别是${v}"
done
[root@nginx ~]# bash test.sh 1 2 3 4 5
----------------测试$*,且无引号--------------
传入的位置参数,分别是1 2 3 4 5
----------------测试$@,且无引号--------------
传入的位置参数,分别是1
传入的位置参数,分别是2
传入的位置参数,分别是3
传入的位置参数,分别是4
传入的位置参数,分别是5
结论:
“$*”添加了引号,在进行for循环的时候,将参数作为了一个大字符串整体
“$@”添加了引号的变量是,依然是以空格区分位置参数
当传入参数中使用引号区别
[root@nginx ~]# bash test.sh 1 2 3 4 5 "6 7" "8" "9"
----------------测试$*,且无引号--------------
传入的位置参数,分别是1 2 3 4 5 6 7 8 9
----------------测试$@,且无引号--------------
传入的位置参数,分别是1
传入的位置参数,分别是2
传入的位置参数,分别是3
传入的位置参数,分别是4
传入的位置参数,分别是5
传入的位置参数,分别是6 7
传入的位置参数,分别是8
传入的位置参数,分别是9
结论:
当你要传入的位置参数多个参数,识别成一个整体字符串就使用"$*"
当你要单独的,提取为一个一个参数,就用"$@",注意添加引号,当传入参数用双引号把多个参数包括内识别为一个字符串