最近开始写点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
|