出于某种原因,我无法获得if语句来测试字符串是否真的等于星号。我已经尝试了我能想到的每一个组合,我不想搞乱文件通配。请帮忙。
if [ $VAR = "\*" ]; then
*更新*
这两项建议都有效。问题显然不是*比较,而是if语句的其他部分。这应该比较$VAR
是否在0到20之间或是通配符。
if [ "$VAR" -gt 0 ] && [ "$VAR" -lt 20 ] || [ "$VAR" = "*" ]; then
IF语句的另一部分,如果显然是最后的比较。
*更新*
再次测试它并检查我的语法。如果$VAR
介于0到20之间,则效果很好(true),当$VAR
超过20时,它也有效(报告为false),但是只要我尝试将$VAR
设置为* if语句怪异并弹出:
line 340: [: *: integer expression expected
答案 0 :(得分:1)
$ VAR="*"
$ if [ "$VAR" = "*" ] ; then echo Star ; fi
Star
引用变量,它们可以包含您不想解释的glob模式,空格或其他可解释的序列。如果$VAR
为空,这也可以避免语法错误。
对于您的第二个问题,如果[ "$VAR" -gt 0 ]
不是数字,则$VAR
没有意义。因此,在这种情况下,您必须避免对该测试进行评估。只需交换您的测试 - ||
和&&
是短路的(至少在bash中,不确定是否是POSIX):
if [ "$VAR" = "*" ] || [ "$VAR" -gt 0 -a "$VAR" -lt 20 ] ; then
答案 1 :(得分:1)
使用bash double brackets的另一个版本:
if [[ $VAR = "*" || ($VAR -gt 0 && $VAR -lt 20) ]]; then
双括号可让您使用&&
和||
。此外,bash不对[[
的参数执行分词或全局扩展,因此$VAR
不需要引用,(
不需要转义。
[[
也适用于zsh和ksh。