1

出于某种原因,我无法获得 if 语句来测试字符串是否字面上等于星号。我已经尝试了所有我能想到的组合,我不想弄乱文件通配符。请帮忙。

if [ $VAR = "\*" ]; then

* 更新 *

这两个建议都有效。问题显然不在于 * 比较,而在于 if 语句的另一部分。这应该比较是否$VAR在 0 和 20 之间或是否是通配符。

if [ "$VAR" -gt 0 ] && [ "$VAR" -lt 20 ] || [ "$VAR" = "*" ]; then

IF 语句的另一部分显然搞砸了最后的比较。

* 更新 *

刚刚再次测试并检查了我的语法。当$VAR在 0 到 20 之间时效果很好(真),当$VAR超过 20 时它也有效(报告为假),但是一旦我尝试设置$VAR为 *,if 语句就会崩溃并弹出:

line 340: [: *: integer expression expected
4

2 回答 2

1
$ VAR="*"
$ if [ "$VAR" = "*" ] ; then echo Star ; fi
Star

当变量可能包含全局模式、空格或其他您不想解释的可解释序列时,请引用它们。如果$VAR为空,这也可以避免语法错误。

对于您的第二个问题,除了数字之外[ "$VAR" -gt 0 ]没有任何意义$VAR。因此,您必须避免在这种情况下评估该测试。只需交换您的测试 -||并且&&是短路的(至少在 bash 中,不确定这是否是 POSIX):

if [ "$VAR" = "*" ] || [ "$VAR" -gt 0 -a "$VAR" -lt 20 ] ; then
于 2013-08-04T08:32:06.263 回答
1

另一个使用 bash双括号的版本:

if [[ $VAR = "*" || ($VAR -gt 0 && $VAR -lt 20) ]]; then

双括号允许您使用&&||。此外,bash 不会对 的参数执行分词或全局扩展[[,因此$VAR不需要引用(也不需要转义。

[[如果您需要(某些)可移植性,也可以在 zsh 和 ksh 中使用。

于 2013-08-04T09:37:47.317 回答