Linux脚本接收命令行参数主要靠位置变量($0-$9、${10}+)、$@/$*区别、getopts解析选项及case匹配固定动作;$#校验数量,"$@"安全遍历,getopts处理-f -v等选项,case适用于start/stop等预设指令。

Linux 脚本接收命令行参数主要靠位置变量和内置工具,核心是理解 $0 到 $9、${10} 及 $@/$* 的区别,再配合 getopts 或 case 处理选项逻辑。
用位置变量直接取参
脚本运行时,bash 自动把命令行内容按空格拆开,分配给位置变量:
-
$0是脚本自身路径(如./deploy.sh) -
$1、$2…$9对应前九个参数;第 10 个起必须写成${10}、${11} -
$#返回参数总个数,适合做数量校验(比如要求至少 2 个参数) - 写法示例:
if [ $# -lt 2 ]; then echo "用法:$0 "; exit 1; fi
区分 $* 和 $@ 处理多参场景
当参数含空格或特殊字符时,$* 和 $@ 行为不同,关键看是否加双引号:
-
"$*"把所有参数拼成一个字符串,用空格连接("a b" "c"→"a b c") -
"$@"保持每个参数原始边界("a b" "c"→"a b"和"c"两个独立参数) - 遍历参数推荐用
for arg in "$@"; do ...; done,安全且保留空格
用 getopts 解析带选项的参数
处理 -f file.conf -v --debug 这类格式,getopts 是标准做法:
- 语法形如
while getopts "ab:c" opt; do case $opt in ... esac; done -
a表示无参开关,b:表示-b后必须跟值(冒号不能省),c同为开关 - 选项后值存于
$OPTARG,当前选项字母存于$opt - 支持自动报错、跳过非法选项,比手工解析更健壮
用 case 匹配固定动作参数
适合只接受几个预设指令的脚本,比如服务启停:
- 写法:
case "$1" in start) systemctl start app ;; stop) systemctl stop app ;; *) echo "用法:$0 {start|stop}"; exit 1 ;; esac - 搭配
basename "$0"可让提示信息显示简洁脚本名,不带路径 - 简单直观,无需引入额外逻辑,维护成本低


















