一、管道与重定向
|
(管道)将前一个命令的输出作为后一个命令的输入。
例:
ls | grep a.txt
(查找a.txt
)。
>
与>>
(输出重定向)>
:覆盖写入文件;>>
:追加到文件末尾。例:
echo "Hello" > file.txt
(覆盖),echo "World" >> file.txt
(追加)。
<
(输入重定向)从文件读取输入。
例:
wc -l < log.txt
(统计文件行数)。
2>
和&>
(错误重定向)2>
:重定向标准错误;&>
:重定向标准输出和错误。例:
grep foo * 2> errors.log
(将错误写入文件)。
二、通配符与扩展
*
匹配任意多个字符。
例:
ls *.txt
(列出所有.txt
文件)。
?
匹配单个字符。
例:
ls file?.txt
(匹配file1.txt
、fileA.txt
等)。
[]
匹配括号内任意一个字符。
例:
ls [abc].txt
(匹配a.txt
、b.txt
、c.txt
)。
{}
(花括号扩展)生成组合内容。
例:
mkdir {dir1,dir2}
(同时创建两个目录)。
三、逻辑操作符
&&
前一个命令成功(退出码为 0)时执行后续命令。
||
前一个命令失败时执行后续命令。
例:
ping host || echo "Host down"
(主机不可用时提示)。
四、引号与转义
' '
(单引号)保留所有字符的字面值,不展开变量。
例:
echo '$USER'
(输出$USER
,而非用户名)。
" "
(双引号)允许变量和命令替换。
例:
echo "User: $USER"
(输出User: root
)。
$()
(命令替换)执行命令并将结果替换到当前位置。
例:
echo "Time: $(date)"
(输出当前时间)。
\
(转义符)转义特殊字符(如空格、
$
)。例:
echo "Price: \$100"
(输出Price: $100
)。
五、变量与参数
$
引用变量或参数。
例:
echo $PATH
(输出环境变量)。
${}
明确变量边界,避免歧义。
例:
echo "${var}_log"
(输出变量var
后跟_log
)。
$0, $1, $2...
脚本参数:
$0
为脚本名,$1
为第一个参数。例:
./script.sh arg1
→$1
为arg1
。
$?
上一个命令的退出状态码(0 表示成功)。
六、后台与进程控制
&
在后台运行命令。
例:
python script.py &
(后台执行脚本)。
;
(命令分隔符)按顺序执行命令,无论前一个是否成功。
例:
cd /tmp; ls
(进入目录后列出内容)。
七、其他常用符号
#
注释符,其后内容被忽略。
例:
# This is a comment
。
~
表示当前用户的主目录。
例:
cd ~/Documents
(进入用户的文档目录)。
-
代表上一个工作目录。
例:
cd -
(返回上次所在的目录)。
<<
(Here Document)输入多行文本直到结束标记。
-
cat << EOF
Line 1
Line 2
EOF
八 、 与$ 组合使用的符号
1. $#
(参数个数)
作用:表示传递给脚本或函数的参数个数(不包括脚本名本身)。
2. $*
与 $@
(所有参数)
$*
将所有参数视为单个字符串(用空格分隔)。
示例:
echo "$*"
→ 输出a b c
(作为一个整体)。
$@
将所有参数视为独立的字符串(保留每个参数的原始边界)。
3. $?
(退出状态码)
作用:表示上一个命令或脚本的退出状态码(0 表示成功,非 0 表示失败)。
4. $$
(当前进程 PID)
作用:表示当前 Shell 或脚本的进程 ID(PID)。
echo "当前进程 PID: $$"
5. $!
(后台进程 PID)
作用:表示最后一个在后台运行的进程的 PID。
sleep 10 & echo "后台进程 PID: $!"
6. $0
(脚本名称)
作用:表示当前运行的脚本或命令的名称。
7. $1, $2, $3...
(位置参数)
作用:表示传递给脚本或函数的第 1、2、3... 个参数。
8. $-
(当前 Shell 选项)
作用:表示当前 Shell 的选项设置(如
himBH
)。echo "当前 Shell 选项: $-"
9. $_
(上一个命令的最后一个参数)
作用:表示上一个命令的最后一个参数。
-
ls /usr/local echo $_ # 输出:/usr/local
vim test.sh
echo "参数个数: $#" echo "第一个数: $1" echo "第二个数: $2" echo "第三个数: $3" echo "当前进程 PID: $$" echo "所有参数: $*" echo "脚本名称: $0"
sh test.sh "a" "b" "c"
总结表格
符号 | 用途 | 示例 |
---|---|---|
$# |
参数个数 | echo $# → 输出参数数量 |
$* |
所有参数(合并为一个字符串) | echo "$*" → a b c |
$@ |
所有参数(保持独立) | for arg in "$@"; do ... |
$? |
上一个命令的退出状态码 | echo $? → 0(成功) |
$$ |
当前进程的 PID | echo $$ → 1234 |
$! |
最后一个后台进程的 PID | echo $! → 5678 |
$0 |
脚本名称 | echo $0 → ./test.sh |
$1, $2... |
第 1、2... 个参数 | echo $1 → hello |
$- |
当前 Shell 的选项设置 | echo $- → himBH |
$_ |
上一个命令的最后一个参数 | echo $_ → /usr/local |
注意事项
$*
vs$@
:不加引号时,两者行为相同。
加双引号时,
"$*"
将所有参数合并为一个字符串,"$@"
保留参数独立性(常用于循环遍历)。
参数边界:
使用${1}_log
替代$1_log
,避免 Shell 将$1_log
误认为变量1_log
。