文章目录
  1. 1. Shell特殊字符小结
    1. 1.1. shell通配符
    2. 1.2. shell元字符
    3. 1.3. shell转义符
    4. 1.4. 文件描述符(File Descriptor)
    5. 1.5. Dollar符号-$
    6. 1.6. 感叹号-!
    7. 1.7. 其他
      1. 1.7.1. 波浪号(~)
      2. 1.7.2. 逗号(,)
      3. 1.7.3. 括号()
      4. 1.7.4. [] 中括号和[[ ]]

Shell特殊字符小结


shell通配符

字符 含义 实例
* 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有,如ab,acb,a22b
? 匹配任意一个字符 a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b
[list] 匹配 list 中的任意单一字符 a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list]或[^list] 匹配 list 中的任意单一字符 a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b
[x-y] 匹配 x-y 中的任意单一字符 如:[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b
{string1,string2,…} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一

注意:通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆,把通配符理解为shell 特殊代号字符就可.

shell元字符

字符 含义
IFS 由 ‘space’ 或 ‘tab’ 或 ‘enter’ 三者之一组成,我们常用 space
CR 由 ‘enter’ 产生
= 设定变量
$ 作变量或运算替换(请不要与 shell prompt 搞混了)
> 重导向 stdout
< 重导向 stdin
竖线 命令管线
& 重导向 file descriptor ,或将命令置于背境执行
( ) 将其内的命令置于 nested subshell 执行,或用于运算或命令替换
{ } 将其内的命令置于匿名function中执行,或用在变量替换的界定范围
; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令
&& 在前一个命令结束时,若返回值为 true,继续执行下一个命令
! 执行 history 列表中的命令,如 !188,

shell转义符

字符 含义
‘’(单引号) 又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)
“”(双引号) 又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换,`用于命令代替
\(反斜杠) 又叫转义,去除其后紧跟的元字符或通配符的特殊意义

注意:’’倒引号 (backticks),中间的内容会当做命令来执行,如
d=date +%Fecho “Today $d”,在倒引号内的 date +%F 会被视为指令,执行的结果会带入 d 变数中。

文件描述符(File Descriptor)

文件描述符 名称 默认值
0 标准输入 stdin 键盘
1 标准输出 stdout 屏幕
2 标准错误输出 stderr 屏幕
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cmd > file 把 stdout 重定向到 file 文件中 
cmd >> file 把 stdout 重定向到 file 文件中(追加)
cmd 1> fiel 把 stdout 重定向到 file 文件中
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中
cmd 2> file 把 stderr 重定向到 file 文件中
cmd 2>> file 把 stderr 重定向到 file 文件中(追加)
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中
cmd < file >file2 cmd 命令以 file 文件作为 stdin,以 file2 文件作为 stdout
cat <>file 以读写的方式打开 file
cmd < file cmd 命令以 file 文件作为 stdin
cmd << delimiter Here document,从 stdin 中读入,直至遇到delimiter 分界符

>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出
<&n 标准输入复制自文件描述符 n
<&- 关闭标准输入(键盘)
>&- 关闭标准输出
n<&- 表示将 n 号输入关闭
n>&- 表示将 n 号输出关闭

Dollar符号-$

1
2
3
4
5
6
7
8
$# --> 执行shell脚本命令行参数的个数,不包含脚本本身
$* --> 获取shell脚本命令行的所有参数
$@ --> 获取shell脚本命令行的所有参数,与$*不同,$*会将所以参数看成一个整体,而,$@仍然保留着每个的引用变量的区段
$? --> 上一条shell命令执行的返回值
$0 --> shell脚本自身的名称
$1 --> 获取shell命令的第一个参数,$2就是第二个,依次类推,注意:${10},${11}
$$ --> 获取当前shell脚本的进程ID
$? --> 获取当前shell脚本的进程状态

感叹号-!

1
2
3
4
5
6
7
!!     --> 表示你执行的上一条命令,cat !!
!$ --> 获取上一条shell脚本命令最后一个参数
$? --> 上一条shell命令执行的返回值
!str --> 获取history命令中以str开头的最近一条命令
!?str? --> 获取history命令中以包含str的最近一条命令
!100 --> 获取history中号码为100的那条命令
!-3 --> 获取history中倒数第几条的那条命令

其他

波浪号(~)

~ 帐户的 home 目录
~+ 当前的工作目录,这个符号代表当前的工作目录,与pwd作用一致
~- 上次的工作目录,这个符号代表上次的工作目录。

转换为十进制
echo \$((2#11111111)) 255(二进制转换为十进制)
echo \$((8#10)) 8(八进制转换为十进制)
echo \$((16#a)) 10(十六进制转换为十进制)

逗号(,)

, 逗点 (comma,标点中的逗号)
这个符号常运用在运算当中当做”区隔”用途。

1
2
3
4
5
[root@root ~]# ((a=1+2,b=2-1))
[root@root ~]# echo $a
3
[root@root ~]# echo $b
1

括号()

( ) 指令群组 (command group)
用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。如下面的例子:(cd ~ ; vcgh=pwd ;echo $vcgh),指令群组有一个特性,shell会以产生 subshell来执行这组指令。因此,在其中所定义的变数,仅作用于指令群组本身.

(( )) 双括号
这组符号的作用与 let 指令相似,用在算数运算上,是 bash 的内建功能。所以,在执行效率上会比使用 let指令要好许多。

[] 中括号和[[ ]]

这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用 || 与&& 逻辑等符号。

文章目录
  1. 1. Shell特殊字符小结
    1. 1.1. shell通配符
    2. 1.2. shell元字符
    3. 1.3. shell转义符
    4. 1.4. 文件描述符(File Descriptor)
    5. 1.5. Dollar符号-$
    6. 1.6. 感叹号-!
    7. 1.7. 其他
      1. 1.7.1. 波浪号(~)
      2. 1.7.2. 逗号(,)
      3. 1.7.3. 括号()
      4. 1.7.4. [] 中括号和[[ ]]