Bash

Posted on 2024-04-10 23:16  woc0x00008279  阅读(9)  评论(0编辑  收藏  举报

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)