不知不觉一个月就过去了,发现什么都没有写,趁放假补一下功课吧。
最近的几个月搞了不少BASH的东西,因为我把系统的升级功能重写了下,原来的代码实在是惨不忍睹。总结几个在重写的过程中的BASH知识点。
- 根据变量名得到变量值,这个在使用动态功能的时候特别有用,其实也很简单 ${!variablename}
- 使用管道后得到管道的某个输出的exit code:${PIPESTATUS[0]}, 0就是拿管道最开始的那个命令的返回值,如果不使用这个,那么exit code永远是0
- 使用“可以得到命令执行的输出结果,比如`hostname -s`,另外一种方式是$(hostname -s)
- 可以直接使用某个方法的返回值做if的条件判断,比如 if my_function; then
- 在引用变量值的时候尽可能给变量加上引号,特别是想把变量值往其他的方法传的时候,例如 my_function “$my_variable”,因为使用的那个变量值包含空格之类的就可能不是你期望的结果了。
- 得到当前代码行的行号:$LINENO
- 方法只能返回int值,不能返回string,所以方法想返回string的时候只能借助global的变量
- exit code的返回值范围是0到255
- 放在双引号里的变量会被解析,如果不想被解析,就用单引号
- 只有方法里面的变量才能定义为local,最外层的变量只能是global,方法里面定义的变量默认也是global
- 在条件判断里面做字符串大小比较,<前面要加个\:if [ “$onestring” \< “$anotherstring” ] ; then
- 把一个local变量的值赋值给一个global变量的时候必须在local变量前加$:globalvar=$localvar
- 在复杂功能里面尽量不要用xargs,因为它会起子shell,变量赋值不能传到外面的功能,尽可能用while do
- 做数字运算其实都是个没那么简单的事情:let “filecount-=1″,变量减一操作,其它类似,使用let加上运算表达式
- 判断是否是空值:if [ -z $somevar] ; then
- 需要把多行的语句放到一行的,应该换行的地方加个分号
- 方法后面的参数可以接其它的方法,后面的方法甚至还可以带参数,只要在方法里面调用”$@”就可以
- 获得上一个语句的返回值:$?
- 循环处理数组中的每个值:for value in “${my_array[@]}”
- 判断一个变量值是否设置了:if [ -z ${myvar+x} ]; then echo “not set”; fi
- 如果要计算两个数并赋值给其他的变量:thirdvar=$(expr $firstvar + $secondvar)
- 条件判断中的字符判断直接用=,数字比较就得 -eq, -gt等,文件目录判断 -f,-d
- 计算数组的大小:${#myarray[@]}
- 把数组里面的值拼成字符串,可以使用”${nodes[@]}”,但是如果你要把这个作为方法的参数传递则不行,必须先把这个结果赋值给一个变量再传递那个变量值:allvalues=”${myarray[@]}”; my_function “$allvalues”
好像还不少,任何一个语言,要用好都不容易,但是如果你知道自己要什么,其实也不难,有google啊。