bash入门


变量替换

$ 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) 会显示文件夹 foobar 中文件的区别。
这一点特性可以与python中的匿名函数lambda互相照应。

字符替换

在bash中,” “双引号 与 ‘ ‘单引号 含义是不同的

$ echo "Hi $foo"
Hi 1

$ echo 'Hi $foo'
Hi $foo

对于单引号,bash不会解析内容的含义,即不会进行类似宏定义的替换。 双引号则相反。


Author: Tsum
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Tsum !
  TOC