空格,一个看不见的字符,很不起眼,很多人经常忽略它,导致代码出错,却还找不着北。
先了解下bash中什么时候该用空格,什么时候不该用。
1. 等号赋值两边不能有空格2. 命令与选项之间需要空格3. 管道两边空格可有可无
1、在[ ] 内部,如果只有一个值(那些因为缺少了空格而连一起的也算),不是空字符串就为真。所以在[ ] 之间的参数,也要两边有空格,而不能堆一起。
[root@noi ~]# if [ 0 ];then echo "equal";fiequal[root@noi ~]# if [ '1' ];then echo 'equal';fiequal[root@noi ~]# if [ '' ];then echo 'equal';else echo 'no equal';fino equal[root@noi ~]# if [ ];then echo 'equal';else echo 'no equal';fino equal
极具迷惑性的代码,原因上面找:
#虽然错了,双等号前后缺少空格,却得到了正确答案。[root@noi ~]# if [ 'abc'=='abc' ];then echo 'equal';else echo 'no equal';fiequal#这次就比较明了了,明显的不能,却说相等。[root@noi ~]# if [ 'abc'=='bcd' ];then echo 'equal';else echo 'no equal';fiequal
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