在学习shell脚本的过程中初学者最容易翻车的地方就是空格乱打
比如我给a变量赋值一个字符串jyc
于是系统报错
root@jycCentos1[13:51:24]:~$ a = jyc
bash: a: command not found...
我寻思这在python里面怎么也不会报错啊,怎么会呢?
于是查询CSDN得到答案,在bash语言中,赋值的=两边是不允许加空格的
而且这样也不行:
root@jycCentos1[13:51:38]:~$ a =jyc
bash: a: command not found...
root@jycCentos1[13:53:37]:~$ a= jyc
bash: jyc: command not found...
真正正确的赋值方法是两边都不加空格
root@jycCentos1[13:53:48]:~$ a=jyc
root@jycCentos1[13:54:59]:~$ echo $a
jyc
于是你很开心的记住了,并且谨记少打空格,于是在下面的一段判断语句中,也尽量控制经常在写python时喜欢敲空格的大拇指:别敲别敲别敲
root@jycCentos1[13:56:56]:~$ [$a=jyc] && echo y || echo n
bash: [jyc=jyc]: command not found...
n
又报错了,于是你打开CSDN查,才发现,原来在判断语句中,空格又是必须的…TwT`
shell脚本对空格有严格的规定,赋值语句等号两边不能有空格,而字符串比较,等号两边必须有空格
赋值时: i=1
i=$((i+1)) // =用作赋值时,两边绝对不能有空格
比较时: if [ $a = $b ] // =用作比较判断时,两边必须有空格
if:
if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]… [ else COMMANDS; ] fi
整数比较:if [ a -xx b ] //中括号前后一定要加空格否则会报错
= //eq equal
root@jycCentos1[13:57:23]:~$ [$a = jy] && echo y || echo n
bash: [jyc: command not found...
n
root@jycCentos1[13:57:56]:~$ [$a = jy ] && echo y || echo n
bash: [jyc: command not found...
n
root@jycCentos1[13:58:28]:~$ [ $a = jy ] && echo y || echo n
n
root@jycCentos1[13:58:33]:~$ [ $a = jyc ]&& echo y || echo n
y
于是在上面的判断式中,你又发现了第二个坑,为啥要用中括号呢,小括号不用?
别急,看下面的代码运行结果,我定义一个变量b=10,记住别乱打空格啦!
root@jycCentos1[14:07:04]:~$ b=10
root@jycCentos1[14:08:53]:~$
root@jycCentos1[14:08:53]:~$ [ $b+1 = 11 ]&& echo y || echo n
n
root@jycCentos1[14:09:36]:~$ [ ${b}+1 = 11 ]&& echo y || echo n
n
root@jycCentos1[14:10:02]:~$ [ ${b}+1 == 11 ]&& echo y || echo n
n
root@jycCentos1[14:10:12]:~$ [ ((${b}+1)) == 11 ]&& echo y || echo n
-bash: syntax error near unexpected token `('
root@jycCentos1[14:10:46]:~$ [ ((${b}+1)) = 11 ]&& echo y || echo n
-bash: syntax error near unexpected token `('
root@jycCentos1[14:10:55]:~$ [[ ((${b}+1)) = 11 ]]&& echo y || echo n
-bash: syntax error in conditional expression
-bash: syntax error near `='
root@jycCentos1[14:11:04]:~$ [[ ((${b}+1)) == 11 ]]&& echo y || echo n
-bash: syntax error in conditional expression
-bash: syntax error near `=='
root@jycCentos1[14:11:10]:~$ (( ${b}+1 == 11 ))&& echo y || echo n
y
root@jycCentos1[14:11:46]:~$ (( ${b}+1 == 12 ))&& echo y || echo n
n
root@jycCentos1[14:11:59]:~$ [ ${b}+1 = 10+1 ]&& echo y || echo n
y
root@jycCentos1[14:12:59]:~$ [ ${b}+1 = 11+1 ]&& echo y || echo n
n
root@jycCentos1[14:13:06]:~$ [[ ${b}+1 =~ ^[0-9]{2}\+[0-9]$ ]]&& echo y || echo n
y
root@jycCentos1[14:15:07]:~$ [[ ${b}+x =~ ^[0-9]{2}\+[0-9]$ ]]&& echo y || echo n
n
root@jycCentos1[14:15:18]:~$ [ ${b}+x =~ ^[0-9]{2}\+[0-9]$ ]&& echo y || echo n
-bash: [: =~: binary operator expected
n
发现问题没有,前面为啥10+1判断是否等于11怎么会返回no呢?
原来问题在于要计算变量结果,需要使用 let 命令或者在(( ))内,否则就匹配的只是10+1这个字符串而已。而$ b与${b}的区别可以在这篇文章中查询,这里不再赘述。
而[ ] 与[[ ]]的区别在于判断式中是否包括正则表达式。具体的描述可以在这篇文章中查询,这里也不再赘述。
总之牢记赋值不打空格,判断空格完整的小口诀,脚本运行报错就会少很多啦!