Shell中空格引起的血案

最近开始写点shell脚本,对linux命令还是比较熟悉的,但是shell脚本却没写过,没想,刚开始写,就郁闷重重。

各种语法错误!!!

最简单的自定义变量赋值,给我报个“未找到命令”的错误。我就郁闷了,代码如下:

client = "/home/works/client"

前后耗时3个小时,也没搞明白哪里出了错,最终知道问题所在是 空格 出了问题。写java写多了,不自觉就敲两个空格,于是喷血就出现了。

还有if的时候,一定得有空格!下面是让我豁然开朗的一篇文章,分享一下。

原文地址http://www.igigo.net/archives/152

空格,一个看不见的字符,很不起眼,也正由于不起眼,很多人经常忽略它,导致代码出错,却还找不着北。这里,我们来聊聊bash中空格的那点事。
先了解下bash中什么时候该用空格,什么时候不该用。

    1. 等号赋值两边不能有空格
    2. 命令与选项之间需要空格
    3. 管道两边空格可有可无

我们来看看常见的问题
1. 赋值时等号两边或者只有左边多了空格

1
2
3
4
5
6
7
8
9
10
11
12
igi@gentoo ~ $ var1 = test
bash : var1: command not found
igi@gentoo ~ $ echo ${var1:?error}
bash : var1: error
igi@gentoo ~ $ echo ${var1?error}
bash : var1: error
igi@gentoo ~ $ var2 = test
bash : var2: command not found
igi@gentoo ~ $ echo ${var2:?error}
bash : var2: error
igi@gentoo ~ $ echo ${var2?error}
bash : var2: error

这里我用了bash的变量扩展,${var1:?error}当var1为unset或null(未定义或空)时, 报指定错误; ${var1?error}当var1为unset时,报指定错误 。从执行结果来看,如果等号左边有空格,则变量名当成命令执行,结果报command not found,变量没有被赋值

2. 赋值时等号左边没有空格,右边有空格(这种情况有点特别,你会发现两种情况)

1
2
3
igi@gentoo ~ $ var= test
igi@gentoo ~ $ var= nocmd
bash : nocmd: command not found

同样是等号右边有空格,第一条命令没报错,而第二条报错了。
这是因为shell中有这么一种执行命令的方式: var=string command
命令command将得到变量var的值(至于在命令执行后,变量var的值是否保留下来,bash4中没有保留,但我在dash中发现时保留下来的,不同的shell对这个的处理不同), 由于test是个命令,而nocmd不是,所以报了command not found.

1
2
3
igi@gentoo ~ $ var=newtest eval echo \$var
newtest
igi@gentoo ~ $ echo $var

注意: 这里我使用了eval, 是想避免在第一次解析时$var被替换成空字符串, 不然就会出现下面的情况(下面是错误的测试方法,在echo还没执行时,$var已经被替换成空字符串)

1
2
3
igi@gentoo ~ $ var=newtest echo $var
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值