在 Shell 中,有许多特定符号和运算符用于控制流程、管理输入输出、传递参数等。以下是一些常见的 Shell 符号及其简要说明:
1. 基本符号
#
表示注释,后面的内容不会被执行。;
命令分隔符,用于在同一行中执行多个命令。&&
逻辑与,前面的命令成功后才会执行后面的命令。||
逻辑或,前面的命令失败后才会执行后面的命令。&
在后台运行命令。
2. 重定向符号
>
将输出重定向到文件,覆盖文件内容。>>
将输出重定向到文件,追加到文件内容末尾。<
从文件中读取输入。2>
将标准错误输出重定向到文件。2>>
将标准错误输出追加到文件。
3. 管道符
|
将一个命令的输出作为另一个命令的输入。
4. 文件和目录符号
.
表示当前目录。..
表示上级目录。~
表示当前用户的主目录。*
通配符,表示任意字符(零个或多个)。?
通配符,表示单个字符。
5. 变量和参数
$
引用变量的值,例如$VAR
表示变量VAR
的值。$$
表示当前 Shell 进程的 PID。$?
表示上一个命令的退出状态。$#
表示脚本参数的个数。$@
表示所有传递给脚本的参数(以独立参数的形式)。$*
表示所有传递给脚本的参数(作为一个单独的字符串)。
6. 命令替换
`command`
或$(command)
:将命令执行的结果替换到当前命令中。
7. 条件表达式
[
和]
用于条件判断,类似于test
命令。[[
和]]
扩展版本的测试工具,支持更多的功能(如模式匹配)。
8. 其他符号
{}
用于命令组、参数扩展等场景。()
用于子 Shell 执行,或者用于命令分组。!
用于逻辑非,表示取反。
9. 拓展与替换
-
参数扩展:
${VAR}
扩展变量VAR
,用于避免变量名歧义。${VAR:-default}
如果VAR
未设置或为空,返回default
。${VAR:+value}
如果VAR
设置且不为空,返回value
;否则返回空。${#VAR}
返回变量VAR
的长度。
-
数组:
array=(value1 value2 value3)
定义一个数组。${array[index]}
访问数组元素。${array[@]}
表示数组的所有元素。
10. Job Control(作业控制)
jobs
列出当前后台作业。fg %job_id
将后台作业带回前台。bg %job_id
将作业放到后台运行。disown
移除作业的 shell 进程,允许作业独立于 shell 运行。
11. 其他常用命令和特性
-
命令历史:
!!
执行最后一条命令。!n
执行历史第 n 条命令。!-n
执行倒数第 n 条命令。
-
快捷键:
Ctrl + C
终止当前命令。Ctrl + Z
将当前前台命令挂起。Ctrl + D
表示 EOF,通常用于结束输入或退出 shell。
12. 执行权限命令
- chmod 用于更改文件或目录的权限。
chmod 755 filename
- chown 用于更改文件或目录的所属用户和组。
chown user:group filename
13. 相关环境符号
$PATH
环境变量,定义可执行文件的搜索路径。$HOME
当前用户的主目录。$USER
当前用户的用户名。$SHELL
当前使用的 Shell 程序。
14. 输入输出参数
- 标准输入和输出:
- 标准输出(stdout)是文件描述符 1。
- 标准错误输出(stderr)是文件描述符 2。
- 可以通过重定向相关的描述符进行输入输出管理。
15. 特殊变量
$!
上一个后台命令的 PID(进程ID)。$_
最后执行的命令的最后一个参数。
16. 特殊符号的高级用法
16.1 <<
和 <<<
(Here Document 和 Here String)
- Here Document:
<<
用于将多行文本作为输入传递给命令。
command << DELIMITER
text
to be
passed
DELIMITER
例如:
cat << EOF
Hello, World!
This is a here document example.
EOF
- Here String:
<<<
用于将单个字符串传递给命令。
command <<< "string"
例如:
cat <<< "Hello, World!"
16.2 :
(空命令/占位符)
:
是一个 Shell 内建命令,它什么都不做,但常用于条件判断、循环、或作为占位符。
: # 这是一个占位符,通常用于不需要执行任何操作的地方
16.3 \
(换行符)
\
用于在 Shell 脚本或命令行中将一行的命令延续到下一行。
command \
--option \
argument
16.4 ()
和 {}
(子 Shell 和命令组)
- 子 Shell:
()
用于创建子 Shell,子 Shell 中的变量和环境不会影响父 Shell。
(cd /tmp; touch newfile.txt)
- 命令组:
{}
用于将多个命令作为一个整体执行,通常用于输入输出重定向。
{ echo "Output 1"; echo "Output 2"; } > output.txt
17. 数学计算和表达式
- 整数计算:
(())
用于整数计算。
result=$(( 5 + 3 ))
echo $result # 输出 8
- 浮点计算:
bc
命令用于浮点计算。
result=$(echo "scale=2; 5 / 3" | bc)
echo $result # 输出 1.66
18. 高级字符串操作
- 字符串替换:
VAR="hello world"
echo ${VAR/world/everyone} # 输出 "hello everyone"
- 字符串截取:
VAR="hello world"
echo ${VAR:0:5} # 输出 "hello"
- 字符串长度:
VAR="hello world"
echo ${#VAR} # 输出 11
19. 特殊文件描述符
-
标准输入/输出/错误:
- 标准输入(stdin):文件描述符为 0。
- 标准输出(stdout):文件描述符为 1。
- 标准错误(stderr):文件描述符为 2。
-
重定向示例:
command > output.txt
20. 进程和信号控制
20.1 &
(后台运行)
&
用于将命令在后台运行,这样你可以继续使用终端而不被该命令阻塞。
command &
- 获取后台进程的 PID:
command & echo $!
# $! 表示最后一个后台进程的 PID
20.2 wait
(等待后台进程)
wait
命令用于等待后台进程结束。
command1 &
command2 &
wait # 等待所有后台进程结束
20.3 Ctrl + Z
和 fg
/ bg
(挂起和前后台切换)
Ctrl + Z
可以将前台运行的进程挂起,并将其放到后台。fg
将后台挂起的进程带回前台运行。
fg %job_id # job_id 是通过 jobs 命令获取的
bg
将挂起的进程放到后台继续运行。
bg %job_id
20.4 kill
和 killall
(终止进程)
kill
命令用于发送信号给进程,默认发送SIGTERM
信号以终止进程。
kill pid
- 常见信号:
SIGHUP
(1):挂起信号,通常用于让进程重新读取配置文件。SIGINT
(2):中断信号,通常通过Ctrl + C
发送。SIGKILL
(9):强制终止进程。SIGTERM
(15):请求终止进程,可以被捕获和处理。
例如,强制终止进程:
kill -9 pid
killall
可以终止所有匹配名称的进程:
killall process_name
21. 文件锁定和原子操作
21.1 flock
(文件锁定)
flock
用于对文件进行加锁,以确保在并发环境中文件操作的原子性。
flock /path/to/lockfile -c "command"
21.2 mktemp
(创建临时文件或目录)
mktemp
用于创建临时文件或目录,通常用于需要临时存储的场景。
temp_file=$(mktemp)
echo "Temporary data" > $temp_file
- 创建临时目录:
temp_dir=$(mktemp -d)