学习BASH,已有十天了。每次阅读BASH脚本时,总是碰见一些同样的问题。总结一下,防止再犯。
1 引号
BASH是一个解释语言,在LINUX下,BASH的解释器是终端或者shell。随心所欲的处理字符是BASH强大的地方之一,通配符以及引用都是用以实现这个目标的工具。
引用有两种方式:单引号和双引号。双引号是弱引用,在双引号内的特殊字符仍可以被解释。特殊字符常见的有$,`(反引号,命令替换的作用)等。
单\双引号的例子:
1 num=hello world #报错,因为中间有空格号 2 3 num="hello world" #正确,双引号内的内容作为一个整体赋值 4 5 echo $num 6 7 echo "$num" #两个echo结果一致 8 9 echo '$num' #这个echo将会显示不同的结果,你可以试一试
有些时候,需要显示这些特殊符号($,`),而非解释它们。这时候,单引号就派上用场了。单引号用来显示特殊符号。
以上是单\双引号的介绍,两者作用很相似。另外还有反引号,虽然也叫引号,作用却完全不同于单\双引号。反引号的作用,一般的书介绍是命令替换,这个解释有些抽象,不如换成命令解释。反引号作用,也就是将反引号内的命令解释执行,并将反引号内的命令执行结果输出。不知道我这样说,表达是否更清楚。
反引号的例子:
echo `pwd` #pwd命令是显示当前目录,而echo `pwd`将输出/home/xy
注:一般高手不建议使用反引号进行命令替换,而用$()符号。具体原因不清楚,因为我也是菜鸟。^_^
2 bash中 2> &1 & 的解释
这个我就不写了,有一篇文章写得比较好,网址是:http://blog.csdn.net/astonqa/article/details/8252791
3 /dev/null
/dev/null意味空设备。空设备意味着所有输入其中的内容都将消失。
它的作用,将一些过于巨大的出错信息文件自动销毁。
4 $@,$*,$?,$#的解释
在终端中,每当运行一个命令时,比如“ls -l"或“cat 1.txt”,命令行以空格作为分隔符,然后将分隔开来的字符作为参数输入终端解释器(shell),ls和-l将分别输入,在bash中,对于命令行中不同位置的参数有统一的名字:位置参数。位置参数的表示就是$0,$1,$2等。而$#表示位置参数的个数,如ls -l 位置参数个数是2。$@和$*都表示包含所有的位置参数。唯一的区别是$@被解释为"$1""$2".....,而$*被解释为"$1 $2 $3....."。通过下面这个示例代码最容易解释:
#!/bin/bash my_fun(){ echo "$# arguments" } my_fun "$*" my_fun "$@" #两者运行结果不一样
结果不一样的原因:仔细看这一小节中的红色字体,双引号的解释。我的理解放在下面的view code中,你可以先试着回答。
my_fun "$*" 这个命令将被解释器翻译为my_fun "$1 $2 $3",shell中运行,双引号内的内容相当于一个参数。 my_fun "$@" 这个命令将被解释为my_fun "$1" "$2"....,有多个参数。 所以,两者运行结果不一致。
$?的作用
一个命令就是一个程序,运行结果都有退出状态。在shell中,退出状态,如果不将其立即保存,它就会“消失”。而$?作用就是保存命令的退出状态。其值($?)为运行的最后一个命令的退出状态。例如
cd dir
echo $? ###假设dir存在,则shell显示0,否则,为1。
shell中,除了$?保存退出状态,还有return语句,可以将退出状态保存在某个变量中。方式如下:
return $es ####es的值就是某个函数的退出状态