programing

이중 또는 단일 대괄호, 괄호, 중괄호 사용 방법

nasanasas 2020. 10. 2. 22:31
반응형

이중 또는 단일 대괄호, 괄호, 중괄호 사용 방법


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

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

중괄호 확장에 대해 상기시켜 주신 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
    

There is a subtle syntactic difference with ( ), though (see bash reference) ; essentially, a semicolon ; after the last command within braces is a must, and the braces {, } must be surrounded by spaces.


Brackets

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

Curly Braces

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

Parentheses

( 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 

Double Parentheses

(( 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

I just wanted to add these from 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

The difference between test, [ and [[ is explained in great details in the BashFAQ.

To cut a long story short: test implements the old, portable syntax of the command. In almost all shells (the oldest Bourne shells are the exception), [ is a synonym for test (but requires a final argument of ]). Although all modern shells have built-in implementations of [, there usually still is an external executable of that name, e.g. /bin/[.

[[ is a new improved version of it, which is a keyword, not a program. This has beneficial effects on the ease of use, as shown below. [[ is understood by KornShell and BASH (e.g. 2.03), but not by the older POSIX or BourneShell.

And the conclusion:

When should the new test command [[ be used, and when the old one [? If portability to the BourneShell is a concern, the old syntax should be used. If on the other hand the script requires BASH or KornShell, the new syntax is much more flexible.


Parentheses in function definition

Parentheses () are being used in function definition:

function_name () { command1 ; command2 ; }

That is the reason you have to escape parentheses even in command parameters:

$ 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

참고URL : https://stackoverflow.com/questions/2188199/how-to-use-double-or-single-brackets-parentheses-curly-braces

반응형