# 1. bash 脚本笔记

# 1.1. 模式扩展

# 1.1.1. ? 字符扩展

?字符代表文件路径里面的任意单个字符,不包括空字符。比如,Data???匹配所有Data后面跟着三个字符的文件名。

? 字符扩展属于文件名扩展,只有文件确实存在的前提下,才会发生扩展。如果文件不存在,扩展就不会发生

# 1.1.2.

# 1.1.3. *字符

*字符代表文件路径里面的任意数量的任意字符,包括零个字符

注意,**不会匹配隐藏文件(以.开头的文件),即ls 不会输出隐藏文件

如果要匹配隐藏文件,需要写成.*。

比如echo .*

*只匹配当前目录,不会匹配子目录

# 1.1.4. 子命令扩展

$(...)可以扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值

$ echo $(date)
Tue Jan 28 00:01:13 CST 2020

还有另一种较老的语法,子命令放在反引号之中,也可以扩展成命令的运行结果。

$ echo `date`
Tue Jan 28 00:01:13 CST 2020

$(...)可以嵌套,比如$(ls $(pwd))。

# 1.1.5. 算术扩展

$((...))可以扩展成整数运算的结果

$ echo $((2 + 2))
4

# 1.2. 变量

读取变量的时候,变量名也可以使用花括号{}包围,比如$a也可以写成${a}这种写法可以用于变量名与其他字符连用的情况

$ a=foo
$ echo $a_file

$ echo ${a}_file
foo_file

上面代码中,变量名a_file不会有任何输出,因为 Bash 将其整个解释为变量,而这个变量是不存在的。只有用花括号区分$a,Bash 才能正确解读

事实上,读取变量的语法$foo,可以看作是${foo}的简写形式

小结:${}是读取变量,$()是子命令扩展,$(())是算术扩展。