最近在学习《Linux命令行和shell脚本编程大全》(第四版)这本书,对于自己遇到的问题以及通过搜索引擎和书籍中的解决方案进行一个案例的剖析,希望对于像我这样的初学者,有一个帮助。
在第十二章结构化命令的test命令章节中字符串比较小节中,我自己的验证示例如下:
#!/bin/bash
param1=Full
param2=""
if [ $param1 > $param2 ]
then
echo "\$param1 大于 \$param2"
fi
if [ -z $param2 ]
then
echo "\$param2 是空值"
else
echo "\$param2 非空"
fi
出现报错:
test1.sh: line 4: $param2: ambiguous redirect
ambiguous redirect
该报错的意思是:不明确的重定向,因为>
或者<
号在脚本中被视为了重定向,而$param2
本身为空值,此处的重定向的语句就会被抛出ambiguous redirect
错误。
书中直接将答案给出:“大于号和小于号必须转义,否则shell会将其视为重定向符,将字符串值当作文件名”,因此需要在大于号或者小于号前进行转义,如下:
#!/bin/bash
param1=Full
param2=""
if [ $param1 \> $param2 ]
then
echo "\$param1 大于 \$param2"
fi
if [ -z $param2 ]
then
echo "\$param2 是空值"
else
echo "\$param2 非空"
fi
发现又双报错
[root@iZuf6gxtsgxni1r88kx9rtZ gulu]# sh test1.sh
test1.sh: line 4: [: Full: unary operator expected
unary operator expected
报错根据搜索引擎,发现unary operator expected
报错的意思是一元运算符预期错误,其实这个字段的本身我们能猜到一点方向。但这里先卖个关子,讲一些相关的知识点。
'
和"
的差异这里直接引用别人的成果:
在shell脚本中,单引号(')和双引号(")都用于文本引用,但它们之间有一些区别:
双引号
单引号
反引号
$(...)
无引号
总而言之,''
相当于绝对引用,能用绝对引用除了'
之外所有字符,也就是能保证引用内的全部字面意思;而"“
相当于相对引用,对于变量,转义等,引用的是实际的值。
由于报错提示是说由于一元运算符预期的错误,那我们再会过来看看shell脚本。
param2=""
param2用""
来赋了一个空值,在变量引用的时候,使用了无引用,而跟上2.1的关于引用的知识点,容易想到,是否是由于无引用导致了空格的字符串的不完整输出,导致一元运算符运算失败呢?
所以,修改如下:
#!/bin/bash
param1=Full
param2=""
if [ "$param1" \> "$param2" ]
then
echo "\$param1 大于 \$param2"
fi
if [ -z $param2 ]
then
echo "\$param2 是空值"
else
echo "\$param2 非空"
fi
结果如下:
[root@iZuf6gxtsgxni1r88kx9rtZ gulu]# sh test1.sh
$param1 大于 $param2
$param2 是空值
问题解决!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。