(注:有一个非常相似的问题,昨天问得很奇怪,但它没有涵盖我关心的主要语法。如果我要更新另一个问题以包含它们,可能会使答案不再有效,所以我将在这里重点关注另一个问题中遗漏的内容。任何想要了解全貌的人都应该看看这两个问题及其接受的答案。)
我通常将 if 语句写成如下:
if [[ -z "$SOMETHING" ]]; then
# blah blah blah
fi
这对我来说在 Bash 和 Z Shell 下工作得很好,但我最近遇到了完全删除方括号的语法:
if command -v given-command > /dev/null 2>&1; then
echo given-command is available
else
echo given-command is not available
fi
不带括号的版本可以移植吗?与所提供的选项相比如何这里?
我的标准版本主要仅在 Bash 和 Z Shell 上受支持(就像[[ -w /home/durrantm ]] && echo "writable"
其他问题中提到的版本一样)吗?
答案1
是的,您的标准版本不是 POSIX 标准,正如您链接到注释的问题一样。然而,以下情况是:
if some-command args; then ...
我想说这是 的唯一可移植形式if
,因为这就是if
全部内容。if
如果some-command
(可以是函数、shell 内置函数或可执行文件1)返回0
运行时使用的参数和输入,则执行某些操作。
当您运行if [ ]
或if [[ ]]
、[ ]
和时,如果条件测试为真,则[[ ]]
程序或 shell 内置命令将返回。0
如果您转换[
为test
,您会发现您始终运行不带括号的表单:
if [ ... ]
# same as
if /bin/test ...
1更准确地说,让我们看看如何if
构建被定义为:
这如果命令应执行复合列表并使用其退出状态来确定是否执行另一个复合列表。
的格式为如果构造如下:
if compound-list then compound-list [elif compound-list then compound-list] ... [else compound-list] fi