Shell初学脚本容易踩得最多的坑--空格篇&中括号[]篇

在学习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}的区别可以在这篇文章中查询,这里不再赘述。
而[ ] 与[[ ]]的区别在于判断式中是否包括正则表达式。具体的描述可以在这篇文章中查询,这里也不再赘述。

总之牢记赋值不打空格,判断空格完整的小口诀,脚本运行报错就会少很多啦!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值