空格,一个看不见的字符,很不起眼,很多人经常忽略它,导致代码出错,却还找不着北。
先了解下bash中什么时候该用空格,什么时候不该用。
1. 等号赋值两边不能有空格 2. 命令与选项之间需要空格 3. 管道两边空格可有可无
1、在[ ] 内部,如果只有一个值(那些因为缺少了空格而连一起的也算),不是空字符串就为真。所以在[ ] 之间的参数,也要两边有空格,而不能堆一起。
[root@noi ~]# if [ 0 ];then echo "equal";fi equal [root@noi ~]# if [ '1' ];then echo 'equal';fi equal [root@noi ~]# if [ '' ];then echo 'equal';else echo 'no equal';fi no equal [root@noi ~]# if [ ];then echo 'equal';else echo 'no equal';fi no equal
极具迷惑性的代码,原因上面找:
#虽然错了,双等号前后缺少空格,却得到了正确答案。 [root@noi ~]# if [ 'abc'=='abc' ];then echo 'equal';else echo 'no equal';fi equal #这次就比较明了了,明显的不能,却说相等。 [root@noi ~]# if [ 'abc'=='bcd' ];then echo 'equal';else echo 'no equal';fi equal
2、在bash里面,最好给变量加上双引号,防止运行出现意外。如果没有双引号,shell遇到未定义的变量或者在变量值中含有空格时,
将导致不可预料的错误。
[root@noi ~]# filename="my document"
#touch生成了2个文件my和document
[root@noi ~]# touch $filename
[root@noi ~]# ls
alias.set a.out default.pass document exists_folder exists.txt my t t1 t1.cpp t.c t.cpp t.sh wai.bat
#添加双引号后,没有错误了
[root@noi ~]# touch "$filename"
[root@noi ~]# ls
alias.set a.out default.pass document exists_folder exists.txt my my document t t1 t1.cpp t.c t.cpp t.sh wai.bat
[root@noi ~]# ls $filename
document my
[root@noi ~]# rm document my
rm: remove regular empty file `document'? y
rm: remove regular empty file `my'? y
[root@noi ~]# ls $filename
ls: cannot access my: No such file or directory
ls: cannot access document: No such file or directory
[root@noi ~]# ls -l "$filename"
-rw-r--r-- 1 root root 0 May 23 21:30 my document