【问题标题】:Understand the use of braces and parenthesis in if理解 if 中大括号和圆括号的使用
【发布时间】:2015-07-02 10:18:25
【问题描述】:

在我浏览的一些代码中,我发现if 在某个地方使用大括号 {},在其他地方使用括号 (())。谁能告诉我确切的含义以及在哪里使用哪个?

if [ "$1" = "--help" ]

if (( $# != 3 ))

【问题讨论】:

  • Linux 上的 shell (bash) 手册中是否缺少任何内容?输入man bash,然后在寻呼机中输入/\( \(

标签: linux shell unix if-statement


【解决方案1】:

括号[是shell的内置命令;你也可以叫它test:

if [ a = b ]
then ...

等于:

if test a = b
then ...

test 命令的语法是面向文本的(有关详细信息,请参阅 bash 手册页 CONDITIONAL EXPRESSIONS 章节)。

大括号{…} 是shell 语法,用于对命令进行分组(不创建子shell):

{ date; ls; echo $$; } > 1>&2

这将执行datelsecho $$ 并将它们的所有输出重定向到stderr。

括号(…) 是shell 语法,用于创建子shell:

(date; ls; echo $$) > 1>&2

与上面类似,但给出的 PID ($$) 是子shell 的。

分组和子外壳之间的区别很微妙(这里超出了范围)。

双括号 [[…]] 是 shell 语法,但在其他方面的行为类似于单括号 [ 命令。唯一的区别是使用< 等进行字符串比较和语言环境支持。

双括号((…)) 等效于使用let 内置shell 命令。它们基本上允许评估面向数字的表达式 (ARITHMETIC EVALUATION)。 <> 按数字排序(而不是按字典顺序)等。此外,在 for ((i=0; i<10; i++)); do echo "$i"; done 等一些结构中,它们被用作固定语法。

美元括号$(…) 导致它们所包含的命令的输出

echo "$(date)"  # a complicated way to execute date

美元括号 $[…] 已弃用,应替换为美元双括号。

美元双括号 $((…)) 产生它们所包含的数值表达式的值:

echo "$((4 + 3 * 2))"  # should print 10

美元大括号${…} 导致它们包含的变量扩展。在最简单的情况下,这只是一个变量名,然后它们评估为变量值:

a=foo
echo "${a}"  # prints foo

这可以(而且经常是)通过去掉大括号来缩写:$a

但它也可以像${a:-"today is $(date)"} 这样更复杂。有关详细信息,请参阅 bash 手册页中的 Parameter Expansion

重定向括号<(…)>(…) 创建一个子进程,一个与它的输出/输入相关联的文件描述符,以及一个与该描述符相关联的伪文件。它可用于将程序的输出作为看似文件传递给另一个程序:diff <(sleep 1; date) <(sleep 2; date)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2019-08-11
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多