Answers:
:
对于编写必须从内部终止的循环很有用。
while :
do
...stuff...
done
除非调用break
或被exit
调用,否则shell 将永远运行,否则shell会收到终止信号。
while true; do ...; done
与读者交流意图要好于while :; do ...; done
如果您希望在shell脚本中使用“除非”语句,则可以使用“不”条件(对于某些测试可能看起来很愚蠢),也可以在真句中使用“:”,在假句中使用真实代码,条款。
if [ some-exotic-condition ]
then
:
else
# Real code here
fi
“异国情调”可能是您不想否定的东西,或者,如果您不使用“负逻辑”,那就更清楚了。
autoconf
因为:
为空分支添加默认值比找出如何反转条件要容易得多。
!
前面[ some-exotic-condition ]
是多么愚蠢,但是多余的: else
东西却不是愚蠢的。
!
令牌使整个命令管道元素无效。 while ! grep ... ; do ... done
或if ! [ ... ] ; then ... fi
。它基本上在test/[]
语法外部。参见:pubs.opengroup.org/onlinepubs/9699919799/utilities/…–
我发现有两种情况:
有用:
#!/bin/sh
# set VAR to "default value" if not already set in the environment
: "${VAR=default value}"
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR}"
这是允许Shell脚本用户覆盖设置而无需编辑脚本的便捷方法。(但是,命令行参数更好,因为如果用户恰巧拥有在其导出环境中使用的变量,则不会冒意外行为的风险。)这是用户将覆盖设置的方式:
VAR="other value" ./script
该${VAR=value}
语法说要集VAR
到value
如果VAR
尚未设置,然后展开对变量的值。由于我们现在还不在乎变量的值,因此将其作为参数传递给no-op命令:
以将其丢弃。
即使:
是no-op命令,也要:
在运行:
命令之前由外壳程序(而不是命令!)执行扩展,因此仍会发生变量分配(如果适用)。
使用true
或其他命令代替也是可以接受的:
,但是由于意图不明确,因此代码变得更难阅读。
以下脚本也可以使用:
#!/bin/sh
# print the value of the VAR variable. Note that POSIX says the behavior
# of echo is implementation defined if the first argument is '-n' or if any
# argument contains a '\', so use printf instead of echo.
printf '%s\n' "VAR=${VAR=default value}"
但是,上面的内容很难维护。如果在该行${VAR}
上方添加了using printf
行,则必须移动默认分配扩展。如果开发人员忘记移动该任务,则会引入错误。
通常应避免使用空条件块,但有时它们很有用:
if some_condition; then
# todo: implement this block of code; for now do nothing.
# the colon below is a no-op to prevent syntax errors
:
fi
有人认为,空的true if
块比否定测试更容易阅读代码。例如:
if [ -f foo ] && bar || baz; then
:
else
do_something_here
fi
可以说比以下内容更容易阅读:
if ! [ -f foo ] || ! bar && ! baz; then
do_something_here
fi
但是我相信有一些替代方法比空的真实块更好:
将条件放入函数中:
exotic_condition() { [ -f foo ] && bar || baz; }
if ! exotic_condition; then
do_something_here
fi
否定条件之前,将条件放在花括号(或括号,但括号内会产生一个子shell进程,并且对该子shell内的环境所做的任何更改在该子shell外部均不可见)。
if ! { [ -f foo ] && bar || baz; } then
do_something_here
fi
使用||
代替if
:
[ -f foo ] && bar || baz || {
do_something_here
}
当反应是简单的单线反应时(例如声明条件),我更喜欢这种方法:
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$@"; exit 1; }
[ -f foo ] && bar || baz || fatal "condition not met"
除了将其用作不执行任何操作的语句外,您还可以使用它通过将单个语句变成:的参数来注释掉单个语句。
: echo write this line > myfile
仍会创建一个空文件。
:
这不是适当的评论机制。