有时在编写条件语句时,我需要让代码什么也不做。例如,在这里,当$a
大于"10"时,我希望Bash什么也不做;如果$a
小于"5",则打印"1",否则打印"2":
if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
echo "1"
else
echo "2"
fi
然而这会导致错误。有没有一种命令可以什么都不做,同时又不会减慢我的脚本速度?
有时在编写条件语句时,我需要让代码什么也不做。例如,在这里,当$a
大于"10"时,我希望Bash什么也不做;如果$a
小于"5",则打印"1",否则打印"2":
if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
echo "1"
else
echo "2"
fi
然而这会导致错误。有没有一种命令可以什么都不做,同时又不会减慢我的脚本速度?
在shell中,无操作命令是:
(冒号)。
if [ "$a" -ge 10 ]
then
:
elif [ "$a" -le 5 ]
then
echo "1"
else
echo "2"
fi
来自bash手册:
:
(一个冒号)
除了展开参数和执行重定向之外,不执行任何操作。返回值为零。
:
,我会让他们改变它。 - SaintHaxtrue
,我会让他们更改。 if true
是可以的,但 then true
看起来不对。 - Barmarif ! condition; then do something; fi
代替if condition; then :; else do something; fi
。 - Barmar您可以直接使用 true
命令:
if [ "$a" -ge 10 ]; then
true
elif [ "$a" -le 5 ]; then
echo "1"
else
echo "2"
fi
在你的例子中(但不一定适用于所有情况),另一种选择是重新排列if/else语句:
if [ "$a" -le 5 ]; then
echo "1"
elif [ "$a" -lt 10 ]; then
echo "2"
fi
true
和false
测试,则在脚本方面实际上它们都是无操作的,但原则上它们可能在一些接受此语法的shell中分叉,因此使用 :
可能更好。 - dmckee --- ex-moderator kittentrue
和false
是内置命令。对于较旧的shell,true
,false
甚至是:
可能是外部命令(尽管您可能只在非常老的shell中看到后者)。 - Keith Thompsonfalse
可能不是无操作,因为如果使用set -e
(非零退出),那么false
将导致脚本立即退出。 true
是更好的无操作。 :
是真正的无操作,但我必须承认它很难读懂,而且我已经编写bash程序30年了,我也不知道它... - Mark Lakata我们必须避免一个分支,其中$a超过了10,因此,当$a大于"10"时不执行任何操作,如果$a小于"5",则打印"1",否则打印"2"
$a < 10
可以作为一般条件应用于其他所有条件。if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
echo "1"
elif [ "$a" -lt 10 ]
then
echo "2"
fi
只是以上内容的一种变化,将所有内容都包含在$a < 10
条件中:
if [ "$a" -lt 10 ]
then
if [ "$a" -le 5 ]
then
echo "1"
else
echo "2"
fi
fi
(对于这个具体的例子,@Flimzys restructuring 肯定更好,但我想为所有搜索如何什么都不做的人提供一个通用规则。)
(对于这个特定的例子,@Flimzys的重构显然更好,但我希望给那些搜索如何什么都不做的人提供一个通用规则。)
echo "put stuff here"
,那么会破坏一些非登录使用场景(如 scp),只有空格或注释会导致运行时错误。 - Aphoid我使用的是冒号、true和false的替代方式
echo -n ""
它避免了终端中的空行。
您还可以更简洁地执行:
echo -n
echo $[a<=5?1:2]
这是一个简洁的三元运算符,忽略了对a>=10
的任何测试。 - roblogic