什么命令意味着在Bash中有条件地"无所事事"?

Vil*_*age 156 bash conditional no-op

有时在制作条件时,我需要代码什么都不做,例如,在这里,我希望Bash在$a大于"10" 时什么也不做,如果$a小于"5" 则打印"1 ",否则,打印"2":

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi
Run Code Online (Sandbox Code Playgroud)

这会产生错误.是否有一个命令什么都不做,也不会减慢我的脚本?

Bar*_*mar 299

shell中的no-op命令是:(冒号).

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi
Run Code Online (Sandbox Code Playgroud)

bash手册:

:(冒号)
除了扩展参数和执行重定向之外什么都不做.返回状态为零.

  • 当然,您可以简单地重写代码以使用 `if ! 健康)状况; 然后做某事;fi` 而不是 `if 条件;然后 :; 否则做某事;fi`。 (4认同)
  • @SaintHax不,它没有运行`true`.它内置于shell中,不执行任何操作. (3认同)
  • @SaintHax如果有人在非条件语境中使用`true`,我会让他们改变它.`if true`很好,`那么真'似乎错了. (3认同)
  • 例如`同时!ping -c 1 主机名;do :done` 等待 ping 成功。@kingsjester (2认同)

Fli*_*mzy 34

你可以只使用true命令:

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi
Run Code Online (Sandbox Code Playgroud)

在您的示例情况下(但不一定无处不在),另一种方法是重新订购if/else:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi
Run Code Online (Sandbox Code Playgroud)

  • 如果不测试结果,就脚本而言,'true`和`false`实际上都是无操作的,但原则上它们*可以*在一些接受这种语法的shell中进行分叉,所以也许`:`是更好. (7认同)
  • 我更喜欢`:`只是因为它更明确意图是什么 (5认同)
  • 问题是标记为bash.在bash中,`true`和`false`是内置函数.对于较旧的shell,`true`,`false`,甚至`:`可能是外部命令(尽管你可能只在*非常旧的shell中看到后者). (2认同)

Bas*_*i M 8

虽然我没有回答原来提出的无操作命令的问题,但是当人们可能认为" 在这个分支中我不得不做什么 " 时,许多(如果不是大多数)问题可以通过简单地重构逻辑来绕过,以便该分支获胜不会发生.

我尝试使用OPs示例给出一般规则

当$ a大于"10"时什么都不做,如果$ a小于"5"则打印"1",否则打印"2"

我们必须避免一个分支$a超过10 的分支,因此$a < 10一般条件可以适用于所有其他条件.

一般来说,当你说X时什么都不做的时候,那就把它改成为避免X所在的分支.通常,您可以通过简单地否定X并将其应用于所有其他条件来避免发生.

因此,应用规则的OP示例可能会重构为:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi
Run Code Online (Sandbox Code Playgroud)

只是上面的变体,将所有内容都包含在$a < 10条件中:

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi
Run Code Online (Sandbox Code Playgroud)

(对于这个具体的例子,@ Flimzys重组当然更好,但我想为所有搜索如何做什么的人提供一般规则.)

  • 某人可能希望不进行操作的一个原因是,在最初构建代码时会想到一个想法,即可以在以后添加“在此处添加一些内容”而不会产生无意的副作用。例如,如果将if-then-else-fi放在.bashrc中,如果您将“ echo”放在这里”,它将破坏一些非登录用途(例如,scp被破坏),并且只有空格/ comments会导致运行时错误。 (2认同)