shell 中的位置参数
1、位置变量
位置变量并不是用户自定义的,而在shell中可以直接使用,这样一些约定俗成的规则就可以了。
定义:当一条命令或脚本执行时,后面可以跟多个参数,我们使用位置参数变量来表示这些参数
2、位置参数变量
$n : n为数字,
$0代表脚本本身
$1~$9代表第1~9参数,10以上的参数需要用大括号包含,如:${10}
$@:命令行所有参数,但每个参数区别对待,推荐使用这个
$*:命令行所有参数,所有参数视为一个整体
$#:参数总个数
$$:脚本运行的当前进程ID号
$!: 上一个进程的ID号
3、 $@和 $*的区别
$*:命令行所有参数,所有参数视为一个整体
$@:命令行所有参数,但每个参数区别对待
# 双引号中"*"和"@"区别 echo "\$*的输出如下:" for i in "$*"; do # 多个参数当成一个参数传递了 echo $i done echo " " echo "\$@的输出如下:" for i in "$@"; do # 多个参数分开传递 echo $i done
4、set -- 和 exec 的用法
4.1 在Shell中,set -- a b c
的命令用于设置位置参数(Positional Parameters)。
-
语法:
set -- [arguments]
-
用途:
set --
用于重新定义位置参数,即$1
,$2
, ... ,通常用于重设或覆盖脚本启动时传递给它的参数。- 在
set -- /bin/node_exporter "$@"
中:/bin/node_exporter
被设置为新的位置参数$1
。"$@"
表示传递给当前脚本的所有原始参数,被添加为从$2
开始的后续位置参数。
-
结果: 在此命令执行后,位置参数的第一个元素为
/bin/node_exporter
,随后是所有原有的参数。这样做的效果是准备好一组命令和参数供后续执行。
#!/bin/bash
set -- a b c echo "First argument: $1" echo "Second argument: $2" echo "Third argument: $3"
4.2 exec
exec
-
语法:
exec [command] [arguments]
-
用途:
exec
用于用指定的命令替换当前的 Shell 进程。执行此命令后,原来的 Shell 进程会终止并被新的命令进程所替代。- 在
exec "$@"
中:"$@"
展开为所有位置参数,所以exec
实际上在执行node_exporter
程序以及所有准备好的参数。exec
不会启动一个新的子进程,而是替换了 Shell 本身的进程,因此没有返回到原来的脚本中,节省了系统资源。