Linux Shell脚本通过位置参数$0、$1、$2…读取命令行参数,$#获取总数,"$@"安全遍历,shift可左移处理,含空格参数需加引号,示例脚本验证至少两个参数并执行复制。

Linux Shell 脚本读取命令行传入的参数,主要靠位置参数(positional parameters)——这是 bash 自动创建的一组特殊变量,无需声明就能直接使用。
位置参数的基本用法
脚本运行时,bash 会把命令行中输入的内容按空格(或制表符、换行符)切分,并依次赋值给以下变量:
-
$0:当前脚本的文件名(含路径,如
./myscript.sh或/home/user/script.sh) - $1:第一个参数
- $2:第二个参数
- ……
- $9:第九个参数
-
${10}、${11} 等:第十个及以后的参数必须用花括号包裹,否则
$10会被解释为$1后跟字符0
带空格的参数要加引号
如果某个参数本身含空格(比如用户名“Zhang San”或路径“/home/my data”),不加引号会导致被错误切分:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- ❌ 错误写法:
./deploy.sh v1.2 /home/user config file→ 脚本收到 4 个参数:$1=v1.2,$2=/home/user,$3=config,$4=file - ✅ 正确写法:
./deploy.sh v1.2 "/home/user/config file"→$2完整接收/home/user/config file
常用辅助变量和技巧
仅靠 $1 $2 不够灵活?这些变量能帮你判断和遍历:
-
$#:参数总个数(例如
./test.sh a b c中$#值为3) -
$*:所有参数合并成一个字符串,以第一个 IFS 字符(通常是空格)连接,
"$*"整体视为一个词 -
$@:所有参数作为独立词展开,
"$@"是最安全的遍历方式(保留各参数原始边界) -
shift:每执行一次,所有位置参数左移一位(
$2变成$1,$3变成$2……),适合逐个处理未知数量参数
简单示例:检查并使用参数
下面是一个实用片段,判断是否至少传入两个参数,并分别输出:
#!/bin/bash if [ $# -lt 2 ]; then echo "用法: $0 <源文件> <目标目录>" exit 1 fi echo "要复制的文件: $1" echo "目标路径: $2" cp "$1" "$2/"
保存为 copyit.sh,运行 ./copyit.sh report.txt /tmp 即可生效。注意对 $1 和 $2 加双引号,防止路径含空格时报错。

















