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 + Zfg / bg(挂起和前后台切换)

  • Ctrl + Z 可以将前台运行的进程挂起,并将其放到后台。
  • fg 将后台挂起的进程带回前台运行。
fg %job_id  # job_id 是通过 jobs 命令获取的
  • bg 将挂起的进程放到后台继续运行。
bg %job_id

20.4 killkillall(终止进程)

  • 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)