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)
