Administrator
发布于 2025-03-15 / 9 阅读
0

sh脚本位置参数介绍

参数介绍:

$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

结论:

当你要传入的位置参数多个参数,识别成一个整体字符串就使用"$*"

当你要单独的,提取为一个一个参数,就用"$@",注意添加引号,当传入参数用双引号把多个参数包括内识别为一个字符串