变量替换
$ foo=1
定义了一个foo变量。
可以使用$foo
来使用它。bash会将整个字符串替换为1。
$ $foo
bash: 1: command not found
$ echo $foo
1
可以看到,这里$foo 与C语言中的宏定义很像。bash将 $foo
替换为1
以后,将它当成一个指令了。
所以上面的代码相当于:
$ 1
bash: 1: command not found
$ echo 1
1
- 注意定义变量时中间不能有空格,否则bash会把变量名当做一个命令。
$ date Mon Mar 13 15:31:18 2023 $ bar=date $ $bar Mon Mar 13 15:31:48 2023
$bar
被替换为date
, bash把他当做一个命令,返回当前时间。
命令替换
当您通过 $( CMD )
这样的方式来执行CMD
这个命令时,它的输出结果会替换掉 $( CMD )
。例如,如果执行 for file in $(ls)
,shell首先将调用ls
,然后遍历得到的这些返回值。
$ echo $($bar)
Mon Mar 13 15:35:55 2023
$ echo $(date)
Mon Mar 13 15:40:31 2023
$ echo date
date
$ echo "date" #没有进行任何替换
date
$ echo "$(date)" # 先执行 date命令,用返回值替换掉 $(date)
Mon Mar 13 15:41:53 2023
$ echo '$(date)'
$(date)
还有一个冷门的类似特性是 进程替换(process substitution), <( CMD )
会执行 CMD
并将结果输出到一个临时文件中,并将 <( CMD )
替换成临时文件名。这在我们希望返回值通过文件而不是STDIN传递时很有用。例如, diff <(ls foo) <(ls bar)
会显示文件夹 foo
和 bar
中文件的区别。
这一点特性可以与python中的匿名函数lambda
互相照应。
字符替换
在bash中,” “双引号 与 ‘ ‘单引号 含义是不同的
$ echo "Hi $foo"
Hi 1
$ echo 'Hi $foo'
Hi $foo
对于单引号,bash不会解析内容的含义,即不会进行类似宏定义的替换。 双引号则相反。