Bash 如何使用双括号或单括号、圆括号、大括号
我对Bash中括号、圆括号、大括号的用法以及它们的双格式和单格式之间的差异感到困惑。有明确的解释吗Bash 如何使用双括号或单括号、圆括号、大括号,bash,syntax,Bash,Syntax,我对Bash中括号、圆括号、大括号的用法以及它们的双格式和单格式之间的差异感到困惑。有明确的解释吗 单个括号([)通常实际调用名为[;人工测试或人工[的程序以获取更多信息。例如: $ VARIABLE=abcdef $ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi yes $ VARIABLE=abcdef $ echo Variable: $VARIABLE Variable: abcdef $ echo Var
[
)通常实际调用名为[
;人工测试或人工[
的程序以获取更多信息。例如:
$ VARIABLE=abcdef
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
yes
$ VARIABLE=abcdef
$ echo Variable: $VARIABLE
Variable: abcdef
$ echo Variable: $VARIABLE123456
Variable:
$ echo Variable: ${VARIABLE}123456
Variable: abcdef123456
[
)与单括号的功能(基本上)相同,但它是bash内置的
$ VARIABLE=abcdef
$ if [[ $VARIABLE == 123456 ]] ; then echo yes ; else echo no ; fi
no
()
)用于创建子shell。例如:
$ pwd
/home/user
$ (cd /tmp; pwd)
/tmp
$ pwd
/home/user
如您所见,子shell允许您在不影响当前shell环境的情况下执行操作{}
)用于明确标识变量。例如:
$ VARIABLE=abcdef
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
yes
$ VARIABLE=abcdef
$ echo Variable: $VARIABLE
Variable: abcdef
$ echo Variable: $VARIABLE123456
Variable:
$ echo Variable: ${VARIABLE}123456
Variable: abcdef123456
(b) 大括号还用于在当前shell上下文中执行一系列命令,例如
$ { date; top -b -n1 | head ; } >logfile
# 'date' and 'top' output are concatenated,
# could be useful sometimes to hunt for a top loader )
$ { date; make 2>&1; date; } | tee logfile
# now we can calculate the duration of a build from the logfile
(
)在语法上有细微的区别(请参见);从本质上讲,大括号内最后一个命令后面必须有分号;
,大括号{
,}
必须被空格包围
[
)通常实际调用名为[
;人工测试或人工[
的程序以获取更多信息。例如:
$ VARIABLE=abcdef
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
yes
$ VARIABLE=abcdef
$ echo Variable: $VARIABLE
Variable: abcdef
$ echo Variable: $VARIABLE123456
Variable:
$ echo Variable: ${VARIABLE}123456
Variable: abcdef123456
[
)与单括号的功能(基本上)相同,但它是bash内置的
$ VARIABLE=abcdef
$ if [[ $VARIABLE == 123456 ]] ; then echo yes ; else echo no ; fi
no
()
)用于创建子shell。例如:
$ pwd
/home/user
$ (cd /tmp; pwd)
/tmp
$ pwd
/home/user
如您所见,子shell允许您在不影响当前shell环境的情况下执行操作{}
)用于明确标识变量。例如:
$ VARIABLE=abcdef
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
yes
$ VARIABLE=abcdef
$ echo Variable: $VARIABLE
Variable: abcdef
$ echo Variable: $VARIABLE123456
Variable:
$ echo Variable: ${VARIABLE}123456
Variable: abcdef123456
(b) 大括号还用于在当前shell上下文中执行一系列命令,例如
$ { date; top -b -n1 | head ; } >logfile
# 'date' and 'top' output are concatenated,
# could be useful sometimes to hunt for a top loader )
$ { date; make 2>&1; date; } | tee logfile
# now we can calculate the duration of a build from the logfile
但是,
(
)在语法上有细微的区别(请参见);从本质上讲,大括号中最后一个命令之后必须有分号;
,大括号{
,}
必须被空格包围。在Bash中,test
和[
是shell内置的
是一个shell关键字,可以启用其他功能。例如,您可以使用&&
和|
而不是-a
和-o
,并且有一个正则表达式匹配运算符=~
此外,在一个简单的测试中,双方括号的计算速度似乎比单方括号快得多
$time for((i=0;i在Bash中,test
和[
是shell内置的
是一个shell关键字,可以启用其他功能。例如,您可以使用&&
和|
而不是-a
和-o
,并且有一个正则表达式匹配运算符=~
此外,在一个简单的测试中,双方括号的计算速度似乎比单方括号快得多
$time for((i=0;i我只想从以下位置添加这些:
我只想从以下方面添加这些内容:
测试、[和[[之间的区别在中有详细说明
长话短说:test实现了
在几乎所有的shell中(最古老的Bourne shell是
异常),[是test的同义词(但需要
]).尽管所有现代Shell都内置了[,,
通常仍然存在该名称的外部可执行文件,例如。
/bin/[
[[是它的一个新的改进版本,它是一个关键字,而不是一个程序。
这对易用性有好处,如下所示。[[is]
KornShell和BASH(如2.03)理解,但年长者不理解
POSIX或BourneShell
结论是:
什么时候应该使用新的测试命令[],什么时候应该使用旧的测试命令[]?
如果要考虑到BourneShell的可移植性,那么应该使用旧语法
如果另一方面脚本需要BASH或KornShell,
新语法更加灵活
测试、[和[[之间的区别在中有详细说明
长话短说:test实现了
在几乎所有的shell中(最古老的Bourne shell是
异常),[是test的同义词(但需要
]).尽管所有现代Shell都内置了[,,
通常仍然存在该名称的外部可执行文件,例如。
/bin/[
[[是它的一个新的改进版本,它是一个关键字,而不是一个程序。
这对易用性有好处,如下所示。[[is]
KornShell和BASH(如2.03)理解,但年长者不理解
POSIX或BourneShell
结论是:
什么时候应该使用新的测试命令[],什么时候应该使用旧的测试命令[]?
如果要考虑到BourneShell的可移植性,那么应该使用旧语法
如果另一方面脚本需要BASH或KornShell,
新语法更加灵活
括号
if [ CONDITION ] Test construct
if [[ CONDITION ]] Extended test construct
Array[1]=element1 Array initialization
[a-z] Range of characters within a Regular Expression
$[ expression ] A non-standard & obsolete version of $(( expression )) [1]
( command1; command2 ) Command group executed within a subshell
Array=(element1 element2 element3) Array initialization
result=$(COMMAND) Command substitution, new style
>(COMMAND) Process substitution
<(COMMAND) Process substitution
[1]
花括号
${variable} Parameter substitution
${!variable} Indirect variable reference
{ command1; command2; . . . commandN; } Block of code
{string1,string2,string3,...} Brace expansion
{a..z} Extended brace expansion
{} Text replacement, after find and xargs
括号
if [ CONDITION ] Test construct
if [[ CONDITION ]] Extended test construct
Array[1]=element1 Array initialization
[a-z] Range of characters within a Regular Expression
$[ expression ] A non-standard & obsolete version of $(( expression )) [1]
( command1; command2 ) Command group executed within a subshell
Array=(element1 element2 element3) Array initialization
result=$(COMMAND) Command substitution, new style
>(COMMAND) Process substitution
<(COMMAND) Process substitution
(command1;command2)在子shell中执行的命令组
数组=(element1 element2 element3)数组初始化
结果=$(命令)命令替换,新样式
>(命令)进程替换
括号
if [ CONDITION ] Test construct
if [[ CONDITION ]] Extended test construct
Array[1]=element1 Array initialization
[a-z] Range of characters within a Regular Expression
$[ expression ] A non-standard & obsolete version of $(( expression )) [1]
( command1; command2 ) Command group executed within a subshell
Array=(element1 element2 element3) Array initialization
result=$(COMMAND) Command substitution, new style
>(COMMAND) Process substitution
<(COMMAND) Process substitution
[1]
花括号
${variable} Parameter substitution
${!variable} Indirect variable reference
{ command1; command2; . . . commandN; } Block of code
{string1,string2,string3,...} Brace expansion
{a..z} Extended brace expansion
{} Text replacement, after find and xargs
括号
if [ CONDITION ] Test construct
if [[ CONDITION ]] Extended test construct
Array[1]=element1 Array initialization
[a-z] Range of characters within a Regular Expression
$[ expression ] A non-standard & obsolete version of $(( expression )) [1]
( command1; command2 ) Command group executed within a subshell
Array=(element1 element2 element3) Array initialization
result=$(COMMAND) Command substitution, new style
>(COMMAND) Process substitution
<(COMMAND) Process substitution
(command1;command2)在子shell中执行的命令组
数组=(element1 element2 element3)数组初始化
结果=$(命令)命令