Shell 编程:Bash空格的那点事

2019-09-23 09:29:39王旭

[ 命令正名叫test命令,它们两者几乎一样,为什么不是完全一样?来看看这个

igi@gentoo ~ $ [ "abc" = "cba"
bash: [: missing `]‘
igi@gentoo ~ $ [ "abc" = "cba" ]
igi@gentoo ~ $ test "abc" = "cba" ]
bash: test: too many arguments
igi@gentoo ~ $ test "abc" = "cba"

清晰了吧,用[命令时,你必须给它个尾巴], 用test命令时,就不能加个尾巴。尾巴]是[最后一个参数,不可缺少的参数, 代表[命令的结束

扯了这么多,那到底这个和空格有毛关系?说这些,是先让大家明白: [在shell中是个命令,它左右必须有空格!]是[的最后不可缺少的参数,它两边也需要空格(虽然有些命令的参数能连一起,例如ps, 但[命令不行,它的参数之间必须有空格)。让我们看看关于[常见的错误

a. if 与 [ 之间缺少空格

igi@gentoo ~ $ if[ "$HOME" = "/home/igi"];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
igi@gentoo ~ $ if[ "$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
igi@gentoo ~ $ if["$HOME" = "/home/igi"];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
igi@gentoo ~ $ if["$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: syntax error near unexpected token `then'

语法分析错误,很明显,if[ 对于bash来说,不知道是什么鬼东西

b. [与后面的参数之间缺少空格

igi@gentoo ~ $ if ["$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: [/home/igi: No such file or directory
igi@gentoo ~ $ if ["$HOME" = "/home/igi"];then echo 'equal'; fi
bash: [/home/igi: No such file or directory

["$HOME" 对于bash来说,也不知道是什么鬼东西

c. [ ] 之间的参数之间缺少空格

igi@gentoo ~ $ if [ "abc"="abc" ]; then echo 'equal'; fi
equal
igi@gentoo ~ $ if [ "abc"="cba" ]; then echo 'equal'; fi
equal

第一条命令似乎是对的(实际上是正巧而已),看看第二条命令"abc" 和 "cba"明显不同,但却判断为相同。这是因为参数之间缺少了空格,被[命令认为内部是个值而已。看看下面的命令,你就会释然

igi@gentoo ~ $ if [ 0 ]; then echo 'equal'; fi
equal
igi@gentoo ~ $ if [ "1" ]; then echo 'equal'; fi
equal
igi@gentoo ~ $ if [ "" ]; then echo 'equal'; fi
igi@gentoo ~ $ if [ ]; then echo 'equal'; fi

在[ ] 内部,如果只有一个值(那些因为缺少了空格而连一起的也算),不是空字符串就为真。所以在[ ] 之间的参数,也要两边有空格,而不能堆一起

d. 参数和尾巴]之间缺少空格
这个就不罗嗦了,尾巴]也是[命令的参数,如同上面所讲,参数之间必须有空格

扯了这么多[命令与空格的事,但有些时候,缺了空格却能正确运行, 当然这只是你好运, 一起来看看