一、为什么要先学特殊符号¶
在 Linux 命令行里,很多看似普通的符号其实都有特殊含义。理解这些符号后,写命令、写脚本和读别人脚本时都会轻松很多。
这一类常见符号主要包括:
- 引号系列
- 重定向系列
- 通配与扩展写法
二、引号系列¶
2.1 单引号、双引号和不加引号的区别¶
| 写法 | 含义 |
|---|---|
单引号 ' ' |
所见即所得,内容原样输出,不做变量展开和命令替换 |
双引号 " " |
支持变量展开和命令替换,但不会进行通配扩展和大括号展开 |
| 不加引号 | 除变量和命令替换外,还会继续进行单词分割、通配扩展和大括号展开 |
反引号 ` ` |
命令替换,先执行其中的命令,再把结果带回原位置 |
2.2 引号示例¶
单引号示例:
$ echo '`hostname` aaa $(whoami) $UID {1..5}'
`hostname` aaa $(whoami) $UID {1..5}
双引号示例:
$ echo "`hostname` aaa $(whoami) $UID {1..5}"
k8s-node01 aaa root 0 {1..5}
不加引号示例:
$ echo `hostname` aaa $(whoami) $UID {1..5}
k8s-node01 aaa root 0 1 2 3 4 5
从这个例子可以看出:
- 单引号最“保守”,几乎不解析
- 双引号会解析变量和命令替换
- 不加引号最“激进”,还会继续展开
{1..5}
三、重定向系列¶
重定向的核心作用,是把命令的输出、错误或输入改到别的地方。
3.1 常见重定向写法¶
| 写法 | 含义 |
|---|---|
> 或 1> |
标准输出重定向,覆盖写入 |
>> 或 1>> |
标准输出追加重定向 |
2> |
标准错误覆盖写入 |
2>> |
标准错误追加写入 |
命令 >>file 2>&1 |
标准输出和错误都写入同一个文件 |
命令 &>>file |
标准输出和错误一起追加到文件 |
< |
标准输入重定向 |
<< |
Here Document,多行输入重定向 |
3.2 常见示例¶
标准输出追加:
$ echo aaa >> aaa.txt
$ cat aaa.txt
aaa
错误输出写入文件:
$ ech aaa >> aaa.txt
$ cat aaa.txt
-bash: ech: command not found
把正确输出和错误输出都写入同一个文件:
$ ech aaa >> aaa.txt 2>&1
$ cat aaa.txt
-bash: ech: command not found
上面的写法也可以简写为:
$ ech aaa &>> aaa.txt
输入重定向示例:
$ seq 10 > num.txt
$ xargs -n3 < num.txt
1 2 3
4 5 6
7 8 9
10
Here Document 示例:
$ cat > a.txt << EOF
I
love
linux
EOF
$ cat a.txt
I
love
linux
四、通配写法与常见扩展¶
原始笔记把这部分归在“通配符”里,实际使用中可以把它理解成 Shell 中最常见的文件匹配和序列展开写法。
4.1 常见符号¶
| 符号 | 含义 |
|---|---|
* |
匹配任意多个字符 |
? |
匹配任意一个字符 |
[] |
匹配方括号中的任意一个字符 |
[!] 或 [^] |
取反匹配 |
{} |
大括号展开,常用于生成序列或批量命名 |
4.2 大括号展开示例¶
输出等宽数字序列:
$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
输出 1 到 10 中的奇数:
$ echo {1..10..2}
1 3 5 7 9
快速备份文件:
$ cp a.txt{,.bak}
$ ls a.txt*
a.txt a.txt.bak
组合输出:
$ echo A{,B}
A AB
$ echo A{C,B}
AC AB
4.3 ? 和 [] 示例¶
查找 /bin 下文件名恰好为两个字符的命令:
$ ls -l /bin/??
这类写法常用于按文件名长度或固定位置进行快速筛选。
五、小结¶
Shell 特殊符号看起来零碎,但本质上主要解决三类问题:
- 引号控制“内容要不要被解析”
- 重定向控制“输入输出往哪走”
- 通配和扩展控制“参数如何批量展开”
把这三类符号搞清楚后,后面学习正则、三剑客和脚本编写都会顺很多。