最常用且可靠的方式是使用 "$@" 或 "$":"$@" 保持各参数独立完整性,适合含空格等特殊字符的场景;"$" 合并为单字符串,内部空格压缩为一个;还需注意 $#、$0 及 ${10} 等用法,严禁裸用 $@ 或 $*。

Linux 中获取所有传入的脚本参数列表,最常用且可靠的方式是使用 $@ 或 $* 这两个特殊变量,但它们的行为有关键区别,需按场景选择。
用 "$@" 保持每个参数的完整性
当参数中可能含空格、制表符或特殊字符时,"$@" 是首选。它把每个命令行参数当作独立字符串处理,不会破坏原始分隔。
- 例如执行:
./script.sh "file name.txt" -v --debug - 在脚本中写:
for arg in "$@"; do echo "[$arg]"; done - 输出会是三行:
[file name.txt]、[-v]、[--debug],完全保留引号内的空格
用 "$*" 合并为单个字符串
"$*" 把所有参数用**一个空格**连接成单一字符串,适用于需要整体拼接的场合(如日志记录、简单转发)。
- 同样执行:
./script.sh "file name.txt" -v -
echo "All: [$*]"输出:All: [file name.txt -v] - 注意:无论原参数是否带引号,双引号包裹的 "$*" 总是生成一个字符串,内部空格会被压缩为单空格
其他辅助变量也很实用
除了遍历全部参数,还需快速掌握参数数量和边界情况:
-
$#:直接获得参数个数,常用于校验,比如
if [ $# -lt 2 ]; then echo "至少需要两个参数"; exit 1; fi -
$0:脚本自身名称(含路径),可用
$(basename "$0")提取干净的文件名 - 超过 9 个参数时,必须写成
${10}、${11}等形式,不能省略花括号
不推荐裸用 $@ 或 $*(不加引号)
省略双引号会导致单词拆分和路径扩展,极易出错:
-
for arg in $@和for arg in $*在含空格参数时会错误切分 - 例如
"a b" "c d"会被当成四个参数:a、b、c、d - 始终坚持写成
"$@"和"$*"











