shell中遍历参数的关键是配合for循环使用$*和$@:$*将参数拼为单字符串(ifs分隔),$@保持各参数独立边界;$#返回参数个数,用于边界控制或条件判断;单独*或#无参数含义,必须加$前缀。

Shell 中用 * 和 # 遍历参数,关键不是直接“遍历”,而是配合 for 循环或数组展开使用:$* 和 $@ 展开所有位置参数,$# 返回参数个数——它本身不参与遍历,但常用于控制循环边界或做条件判断。
用 $* 和 $@ 展开全部参数(核心操作)
$* 把所有参数拼成一个字符串(以第一个 IFS 字符分隔,默认空格),适合整体处理;$@ 则保持各参数的原始边界(每个参数独立引号化),更安全常用。
- 推荐写法:
for arg in "$@"; do echo "$arg"; done—— 正确处理含空格、换行的参数 - 避免写法:
for arg in $*; do ...—— 会因单词拆分破坏原始参数结构 -
echo "$*" | tr ' ' '\n'可强行逐行输出,但丢失原始分隔符信息,不健壮
用 $# 获取参数总数(辅助判断与边界控制)
$# 是只读整数,表示当前脚本或函数接收到的位置参数个数。它不展开参数,但能帮你决定是否执行循环、跳过空参或做索引计算。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
- 检查是否有参数:
if [ $# -eq 0 ]; then echo "no args"; exit 1; fi - 配合
shift手动遍历:while [ $# -gt 0 ]; do echo "$1"; shift; done - 结合数组索引:
for i in $(seq 1 $#); do echo "arg$i: ${!i}"; done(注意${!i}是间接引用,慎用)
星号 * 单独出现时不展开参数
单独的 * 是通配符,匹配当前目录下文件名,和位置参数无关。想获取所有参数必须加 $ 前缀变成 $* 或 $@;否则 echo * 输出的是文件列表,不是传入的参数。
- 错误示例:
for x in *; do echo "$x"; done—— 遍历的是文件,不是命令行参数 - 正确对应:
for x in "$@"; do ...或set -- a b c; echo "$*"
井号 # 单独也不是变量
# 在 Shell 中是注释符号,$# 才是特殊变量。漏掉 $ 就只是字符,不会被解释为参数计数。
- 无效写法:
echo #或echo $#argv(语法错误) - 有效写法:
echo "got $# args"、if [ $# -ge 2 ]; then ... - 注意:
${#array[@]}是数组长度,和$#不同源,别混淆










