Shell符号详解
Shell符号详解
在 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)
