最直接的方式是使用特殊变量 $@ 或 $*$,其中 "$@" 安全遍历保留参数原始分隔,$*$ 合并为单字符串;$# 获取参数总数,$1、$2 等访问单个参数,shift 可移除已处理参数。

在 Linux Shell 脚本中,获取所有传递的参数最直接的方式是使用特殊变量 $@ 或 $*,它们都代表脚本启动时传入的所有位置参数(即命令行参数),但行为略有不同。
用 $@ 安全遍历所有参数
$@ 在双引号中会将每个参数作为独立字符串处理,保留空格和特殊字符,适合循环遍历时保持原始分隔。这是推荐做法。
- 例如运行
./script.sh "hello world" foo bar -
for arg in "$@"; do echo "$arg"; done会正确输出三行:hello world、foo、bar - 不加引号(
$@)或误用$*可能导致单词分割错误
用 $* 合并为单个字符串(慎用)
$* 把所有参数用第一个 IFS 字符(通常是空格)连接成一个字符串,适合需要整体拼接的场景,但会丢失原始参数边界。
-
echo "$*"输出:"hello world foo bar"(注意:中间空格被压缩为单个) -
echo $*(无引号)更危险,可能触发路径名展开或单词拆分 - 一般仅用于日志记录或调试输出,不建议用于逻辑处理
查看参数个数和逐个访问
除了批量获取,还可通过其他变量辅助判断:
-
$#:参数总数,如echo $#输出3 -
$1,$2, …:按序访问单个参数,支持到$9;超过需用${10}(必须花括号) -
shift命令可移除已处理参数,常用于解析选项(如while [[ $# -gt 0 ]]; do case $1 in ...; shift; done)
实际脚本示例
一个简单打印全部参数的脚本:
#!/bin/bash echo "共 $# 个参数" echo "完整列表:" for arg in "$@"; do printf ' [%s]\n' "$arg" done
保存为 showargs.sh,赋予执行权限后运行即可看到清晰、安全的参数展示。











