0.基本原理
注意:当自己使用./xxx.sh的时候,其实是使用了一个新的shell来运行,因此所有的环境变量设置都会失效。我们可以使用.或者source读取这个脚本来在当前环境下执行。注意:这种情况下就不要exit了,否则shell会退出。其实在自己平时运行shell脚本的时候,新建了一个shell,再利用结尾的exit退出。
1.基础操作与设置
普通的变量设置在当前shell中,而export之后对这个shell的所有子进程也生效。
注意:set是用来设置一些终端相关的特殊变量的,并不是用来设置一般变量的(名字具有干扰性); env可以显示当前设置的变量
变量赋值时,=两边不要加空格
$()或``(反引号)可以包裹一个命令,将其输出结果作为一个字符串值。
bash执行数学运算的时候,使用$[.....]进行计算,在中括号之内,可以直接使用变量名称而不加$(但是不要忘记了[]前面的$);而且中括号内可以避免将*当成通配符。
使用bc进行浮点数运算,可以使用$(echo expr | bc)获得结果;注意bc内可以使用分号分割不同的指令,比如scale=x,设置精度。bc内部也能够设置变量。
linux shell最后一般要exit n来退出.
*是shell中的特殊字符,如果想要
eval + command, 先对command中可能的变量引用进行替换,再执行。利用这一点,可以实现“变量编辑命令”,比如使用某一个变化的字符串作为变量名: eval $str=/home/woc/$str
2.分支,循环
核心原理:根据返回值的不同,命令返回值为0,则执行;如果不为0,不执行。(!注意并不是根据True False,而是刚好反过来)
而使用test判断式其实是因为test本身是一个命令,当所判断的结果为真时,返回0,否则返回非0。细节见《私房菜》P396
使用[]判断和test类似。注意:中括号两侧,以及判断符号两侧必须加空格。如[ $var1 == $var2 ]
常用技巧:将判断某个变量是否为空,通过[ -z "$var" ],来判断字符串是否为空。
注意Shell对于命令的解释是基于字符串的,在使用一个变量或者想使用某一个命令的输出作为for的列表时,一定要记得加上$() .
通过修改IFS为\n,可以实现对文件的按行读取。
对于if ,while , for , until等语句,可以将其整体视为一个“大命令”,这样的话我们可以在结尾的fi, done后面使用 > | <等重定向符号,它会将整个部分的所有输入输出都重定向。注意:当使用<从文件输入的时候,文件的换行符相当于“回车键”,所以当文件内容是abc def\n的时候,abc def是一行的输入!(另: read var可以通过标准输入对var赋值。read还有更多用法,可以man)