echo($x)와 a="($x)"의 차이점은 echo $a입니다.

echo($x)와 a="($x)"의 차이점은 echo $a입니다.

터미널에서 다음 명령을 실행할 때:

x=1
a=($x)

echo $a    #output: 1
echo ($x)  #output: -bash: syntax error near unexpected token `$x'

위의 출력이 다른 이유는 무엇입니까? 또한 다음 두 가지 출력이 다른 이유는 무엇입니까?

$(echo foo) #output: -bash: foo: command not found
(echo foo) #output: foo

추신: 명령 대체를 이해하려고 합니다: $(command)

답변1

Bash에서는 배열 정의, 명령 대체, 명령 그룹화라는 세 가지 다른 괄호 용도를 혼합합니다. 명령 대체 및 명령 그룹화는 표준 구문이며 모든 POSIX 유사 sh쉘이 이를 지원합니다. 또한 배열이 있는 셸은 배열 정의 구문을 지원합니다.

배열 정의

배열은 다음 형식의 복합 할당을 사용하여 할당됩니다.

name=(value1 value2 … )

값이 지정된 값인 단일 요소를 포함하는 배열을 만듭니다 a=($x). 이름으로 배열을 에코하면 귀하의 경우 배열의 첫 번째 요소만 에코됩니다. 이것이 바로 a가 표준 출력으로 인쇄되는 모습입니다.$x1echo $a1

배열에 여러 요소가 있는 경우 "${arrayname[*]}"또는 를 사용하여 "${arrayname[@]}"해당 요소에 액세스할 수 있습니다. 첫 번째는 모든 배열 요소를 하나의 매개변수로 결합하는 반면, 두 번째는 각 요소를 별도의 매개변수로 사용합니다.

bash이 구문은 비슷한 방식으로 배열을 사용할 수 있는 다른 셸 에만 적용됩니다 .

명령 대체(POSIX)

명령 대체를 사용하면 명령 출력이 명령 자체를 대체할 수 있습니다. 명령 대체는 명령이 다음과 같이 괄호로 묶인 경우 발생합니다.

$(command)

귀하의 명령은 $(echo foo)쉘 대체를 수행하고 로 구문 분석하므로 foo귀하가 입력한 것과 동일합니다 foo. 명령이 foo존재하지 않기 때문에 bash는 이에 대해 불평할 것입니다.

명령 그룹화(POSIX)

Bash는 실행할 명령 목록을 하나의 단위로 그룹화하는 두 가지 방법을 제공합니다. 명령어를 그룹화하면 전체 명령어 목록에 대해 리디렉션을 적용할 수 있습니다. 예를 들어 목록에 있는 모든 명령의 출력을 단일 스트림으로 리디렉션할 수 있습니다.

( list )

괄호 안에 명령 목록을 넣으면 하위 쉘 환경(명령 실행 환경 참조)이 생성되고 목록의 각 명령이 하위 쉘에서 실행됩니다. 목록은 서브셸에서 실행되기 때문에 서브셸이 완료된 후에는 변수 할당이 유효하지 않습니다.

명령은 (echo foo)서브셸에서 실행되므로 에코됩니다. 이는 명령 대체와 관련이 없습니다. 매뉴얼에 따르면 서브쉘의 변수 할당은 서브쉘이 완료된 후에 유효하지 않습니다. 간단한 한 줄짜리 텍스트를 작성하려는 경우에 편리합니다. 예를 들어, 대신echo foofoo

for l in {1..10}; do mycommand "$l"; done; unset l

당신은 쓸 수 있습니다,

( for l in {1..10}; do mycommand "$l"; done )

서브쉘의 또 다른 유용한 용도는 다음과 같습니다.

( cd folder; ./mycommand )

바꾸다

cd folder; ./mycommand; cd -

귀하의 명령은 echo ($x)이 세 가지 범주 중 어느 것에도 속하지 않으며 bash구문 오류가 보고됩니다.

변수를 올바르게 인용하세요.

적용 가능한 경우(예: 문자열에 변수 값이 포함되어야 하는 경우) 변수 확장을 인용해야 한다는 점도 언급할 가치가 있습니다. 바라보다언제 큰따옴표가 필요합니까?더 알아보기.

예를 들어, 다음은 위의 특정 구문을 호출하지 않습니다.

x=1
a="($x)"

echo "$a"
echo "($x)"

여기서 두 호출 모두 echo출력됩니다 (1).

bash맨페이지 링크

https://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html

https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html

https://www.gnu.org/software/bash/manual/html_node/Arrays.html

관련 정보