一、为什么要先学特殊符号

在 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 特殊符号看起来零碎,但本质上主要解决三类问题:

  • 引号控制“内容要不要被解析”
  • 重定向控制“输入输出往哪走”
  • 通配和扩展控制“参数如何批量展开”

把这三类符号搞清楚后,后面学习正则、三剑客和脚本编写都会顺很多。