Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用双括号或单括号、圆括号、大括号_Bash_Syntax - Fatal编程技术网

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

我对Bash中括号、圆括号、大括号的用法以及它们的双格式和单格式之间的差异感到困惑。有明确的解释吗

  • 单个括号(
    [
    )通常实际调用名为
    [
    人工测试或
    人工[
    的程序以获取更多信息。例如:

    $ 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环境的情况下执行操作

  • (a) 大括号(
    {}
    )用于明确标识变量。例如:

    $ 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环境的情况下执行操作

  • (a) 大括号(
    {}
    )用于明确标识变量。例如:

    $ 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)数组初始化
    结果=$(命令)命令