不知不觉一个月就过去了,发现什么都没有写,趁放假补一下功课吧。

最近的几个月搞了不少BASH的东西,因为我把系统的升级功能重写了下,原来的代码实在是惨不忍睹。总结几个在重写的过程中的BASH知识点。

  1. 根据变量名得到变量值,这个在使用动态功能的时候特别有用,其实也很简单 ${!variablename}
  2. 使用管道后得到管道的某个输出的exit code:${PIPESTATUS[0]}, 0就是拿管道最开始的那个命令的返回值,如果不使用这个,那么exit code永远是0
  3. 使用“可以得到命令执行的输出结果,比如`hostname -s`,另外一种方式是$(hostname -s)
  4. 可以直接使用某个方法的返回值做if的条件判断,比如 if my_function; then
  5. 在引用变量值的时候尽可能给变量加上引号,特别是想把变量值往其他的方法传的时候,例如 my_function “$my_variable”,因为使用的那个变量值包含空格之类的就可能不是你期望的结果了。
  6. 得到当前代码行的行号:$LINENO
  7. 方法只能返回int值,不能返回string,所以方法想返回string的时候只能借助global的变量
  8. exit code的返回值范围是0到255
  9. 放在双引号里的变量会被解析,如果不想被解析,就用单引号
  10. 只有方法里面的变量才能定义为local,最外层的变量只能是global,方法里面定义的变量默认也是global
  11. 在条件判断里面做字符串大小比较,<前面要加个\:if [ “$onestring” \< “$anotherstring” ] ; then
  12. 把一个local变量的值赋值给一个global变量的时候必须在local变量前加$:globalvar=$localvar
  13. 在复杂功能里面尽量不要用xargs,因为它会起子shell,变量赋值不能传到外面的功能,尽可能用while do
  14. 做数字运算其实都是个没那么简单的事情:let “filecount-=1″,变量减一操作,其它类似,使用let加上运算表达式
  15. 判断是否是空值:if [ -z $somevar] ; then
  16. 需要把多行的语句放到一行的,应该换行的地方加个分号
  17. 方法后面的参数可以接其它的方法,后面的方法甚至还可以带参数,只要在方法里面调用”$@”就可以
  18. 获得上一个语句的返回值:$?
  19. 循环处理数组中的每个值:for value in “${my_array[@]}”
  20. 判断一个变量值是否设置了:if [ -z ${myvar+x} ]; then echo “not set”; fi
  21. 如果要计算两个数并赋值给其他的变量:thirdvar=$(expr $firstvar + $secondvar)
  22. 条件判断中的字符判断直接用=,数字比较就得 -eq, -gt等,文件目录判断 -f,-d
  23. 计算数组的大小:${#myarray[@]}
  24. 把数组里面的值拼成字符串,可以使用”${nodes[@]}”,但是如果你要把这个作为方法的参数传递则不行,必须先把这个结果赋值给一个变量再传递那个变量值:allvalues=”${myarray[@]}”; my_function “$allvalues”

好像还不少,任何一个语言,要用好都不容易,但是如果你知道自己要什么,其实也不难,有google啊。

(Visited 327 times, 1 visits today)