[bash] 이중 또는 단일 괄호, 괄호, 중괄호를 사용하는 방법

Bash에서 대괄호, 괄호, 중괄호 사용 및 이중 또는 단일 형식의 차이점에 혼란 스럽습니다. 명확한 설명이 있습니까?



답변

배쉬에서, test그리고는 [쉘 내장 명령입니다.

이중 브라켓 쉘 키워드입니다, 추가 기능을 사용할 수 있습니다. 예를 들어, 사용 &&하고 ||대신 -a과를 -o하고 정규 표현식 매칭 연산자가있다 =~.

또한 간단한 테스트에서 이중 대괄호는 단일 대괄호보다 훨씬 빠르게 평가되는 것으로 보입니다.

$ time for ((i=0; i<10000000; i++)); do [[ "$i" = 1000 ]]; done

real    0m24.548s
user    0m24.337s
sys 0m0.036s
$ time for ((i=0; i<10000000; i++)); do [ "$i" = 1000 ]; done

real    0m33.478s
user    0m33.478s
sys 0m0.000s

변수 이름을 구분하는 중괄호는 매개 변수 확장에 사용 되므로 다음과 같은 작업을 수행 할 수 있습니다.

  • 변수 내용 잘라 내기

    $ var="abcde"; echo ${var%d*}
    abc
  • 대체물과 유사하게 만들기 sed

    $ var="abcde"; echo ${var/de/12}
    abc12
  • 기본값 사용

    $ default="hello"; unset var; echo ${var:-$default}
    hello
  • 그리고 몇 가지 더

또한 중괄호 확장은 일반적으로 루프에서 반복되는 문자열 목록을 작성합니다.

$ echo f{oo,ee,a}d
food feed fad

$ mv error.log{,.OLD}
(error.log is renamed to error.log.OLD because the brace expression
expands to "mv error.log error.log.OLD")

$ for num in {000..2}; do echo "$num"; done
000
001
002

$ echo {00..8..2}
00 02 04 06 08

$ echo {D..T..4}
D H L P T

Bash 4 이전에는 선행 0 및 증분 기능을 사용할 수 없었습니다.

중괄호 확장에 대해 알려주는 gboffi에게 감사드립니다.

괄호는 산술 연산 에 사용 됩니다 .

((a++))

((meaning = 42))

for ((i=0; i<10; i++))

echo $((a + b + (14 * c)))

정수 및 배열 변수에서 달러 기호를 생략하고 가독성을 위해 연산자 주위에 공백을 포함시킬 수 있습니다.

단일 괄호는 배열 인덱스 에도 사용됩니다 .

array[4]="hello"

element=${array[index]}

오른쪽의 (대부분 / 모두?) 배열 참조에는 중괄호가 필요합니다.

ephemient의 의견에 따르면 괄호는 하위 셸 에도 사용됩니다. 그리고 그것들은 배열을 만드는 데 사용됩니다.

array=(1 2 3)
echo ${array[1]}
2


답변

  1. 단일 괄호 ( [)는 일반적으로 실제로 이름이 지정된 프로그램을 호출합니다 [. man test또는 man [자세한 내용은. 예:

    $ VARIABLE=abcdef
    $ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
    yes
  2. 이중 괄호 ( [[)는 기본적으로 단일 괄호와 동일한 기능을 수행하지만 bash 내장입니다.

    $ VARIABLE=abcdef
    $ if [[ $VARIABLE == 123456 ]] ; then echo yes ; else echo no ; fi
    no
  3. 괄호 ( ())는 서브 쉘을 작성하는 데 사용됩니다. 예를 들면 다음과 같습니다.

    $ pwd
    /home/user
    $ (cd /tmp; pwd)
    /tmp
    $ pwd
    /home/user

    보다시피, 서브 쉘을 사용하면 현재 쉘의 환경에 영향을주지 않고 작업을 수행 할 수 있습니다.

  4. (a) 괄호 ( {})는 변수를 명확하게 식별하는 데 사용됩니다. 예:

    $ VARIABLE=abcdef
    $ echo Variable: $VARIABLE
    Variable: abcdef
    $ echo Variable: $VARIABLE123456
    Variable:
    $ echo Variable: ${VARIABLE}123456
    Variable: abcdef123456

    (b) 중괄호는 또한 현재 쉘 컨텍스트 에서 일련의 명령을 실행하는 데 사용됩니다.

    $ { 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 참조 ). 본질적으로, 세미콜론 ;중괄호 내 마지막 명령 다음은 필수이며, 중괄호 {, } 있어야 공백으로 둘러싸여.


답변

브라켓

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]

[1] http://wiki.bash-hackers.org/scripting/obsolete

중괄호

${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

괄호

( 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 

괄호

(( var = 78 ))            Integer arithmetic
var=$(( 20 + 5 ))         Integer arithmetic, with variable assignment
(( var++ ))               C-style variable increment
(( var-- ))               C-style variable decrement
(( var0 = var1<98?9:21 )) C-style ternary operation


답변

방금 TLDP 에서 이것을 추가하고 싶었 습니다 .

~:$ echo $SHELL
/bin/bash

~:$ echo ${#SHELL}
9

~:$ ARRAY=(one two three)

~:$ echo ${#ARRAY}
3

~:$ echo ${TEST:-test}
test

~:$ echo $TEST


~:$ export TEST=a_string

~:$ echo ${TEST:-test}
a_string

~:$ echo ${TEST2:-$TEST}
a_string

~:$ echo $TEST2


~:$ echo ${TEST2:=$TEST}
a_string

~:$ echo $TEST2
a_string

~:$ export STRING="thisisaverylongname"

~:$ echo ${STRING:4}
isaverylongname

~:$ echo ${STRING:6:5}
avery

~:$ echo ${ARRAY[*]}
one two one three one four

~:$ echo ${ARRAY[*]#one}
two three four

~:$ echo ${ARRAY[*]#t}
one wo one hree one four

~:$ echo ${ARRAY[*]#t*}
one wo one hree one four

~:$ echo ${ARRAY[*]##t*}
one one one four

~:$ echo $STRING
thisisaverylongname

~:$ echo ${STRING%name}
thisisaverylong

~:$ echo ${STRING/name/string}
thisisaverylongstring


답변

간의 차이 테스트 , [ 그리고 [ 좋은 세부 설명한다 BashFAQ .

간단히 말해 : 테스트는 명령의 이전 구문을 구현합니다. 거의 모든 쉘에서 (가장 오래된 Bourne 쉘은 예외입니다), [는 테스트의 동의어입니다 (그러나 마지막 인수는]이 필요합니다). 모든 최신 쉘에는 [의 내장 구현이 있지만 일반적으로 / bin / [와 같은 해당 이름의 외부 실행 파일이 여전히 있습니다.

[[이 프로그램의 새로운 개선 된 버전은 프로그램이 아니라 키워드입니다. 이것은 아래와 같이 사용의 용이성에 유리한 영향을 미칩니다. [[KornShell 및 BASH (예 : 2.03)는 이해하지만 이전 POSIX 또는 BourneShell은 이해하지 않습니다.

그리고 결론 :

새로운 테스트 명령은 언제 사용해야합니까? BourneShell 로의 이식성이 문제가되는 경우 이전 구문을 사용해야합니다. 반면에 스크립트에 BASH 또는 KornShell이 ​​필요한 경우 새 구문이 훨씬 유연합니다.


답변

함수 정의의 괄호

()함수 정의에
괄호 가 사용되고 있습니다 :

function_name () { command1 ; command2 ; }

이것이 명령 매개 변수에서도 괄호를 피해야하는 이유입니다.

$ echo (
bash: syntax error near unexpected token `newline'

$ echo \(
(

$ echo () { command echo The command echo was redefined. ; }
$ echo anything
The command echo was redefined.


답변

Truncate the contents of a variable

$ var="abcde"; echo ${var%d*}
abc

Make substitutions similar to sed

$ var="abcde"; echo ${var/de/12}
abc12

Use a default value

$ default="hello"; unset var; echo ${var:-$default}
hello