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
답변
-
단일 괄호 (
[
)는 일반적으로 실제로 이름이 지정된 프로그램을 호출합니다[
.man test
또는man [
자세한 내용은. 예:$ VARIABLE=abcdef $ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi yes
-
이중 괄호 (
[[
)는 기본적으로 단일 괄호와 동일한 기능을 수행하지만 bash 내장입니다.$ VARIABLE=abcdef $ if [[ $VARIABLE == 123456 ]] ; then echo yes ; else echo no ; fi no
-
괄호 (
()
)는 서브 쉘을 작성하는 데 사용됩니다. 예를 들면 다음과 같습니다.$ pwd /home/user $ (cd /tmp; pwd) /tmp $ pwd /home/user
보다시피, 서브 쉘을 사용하면 현재 쉘의 환경에 영향을주지 않고 작업을 수행 할 수 있습니다.
-
(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
답변
~:$ 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
