&& 및 ||에 대해 읽었습니다. 잘못된 경우 두 개의 명령을 실행하고 싶습니다.
나는 시도 ;
했지만 항상 실행 됩니다. 중괄호에 넣으려고했지만 { command1; command2 }
구문 오류가 발생합니다.
나는 같은 것을하고 싶다
command && echo "Ok, continuing" || echo "Check internet connection"; exit 1
인터넷에 연결되지 않은 경우에만 종료됩니다.
답변
parens를 사용하면 명령이 항상 원하는 것은 아닌 서브 쉘에 배치됩니다. 또는 중괄호를 사용하십시오.
command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }
트릭은 괄호와 달리 중괄호의 마지막 명령 뒤에을 사용해야합니다 ;
.
세미콜론이나 줄 바꿈이 필요한 이유
중괄호는 명령에 대한 유효한 인수입니다. 예를 들어, 다음에 대한 인수로 중괄호가 있습니다 echo
.
$ echo }
}
결과적으로 쉘에 다음이 표시되면
{ command1; command2 }
쉘은 command1을 인수가없는 것으로 해석하고 command2를 문자로 구성된 하나의 인수를 갖는 것으로 해석합니다 }
. 중괄호 }
는 세미콜론이나 줄 바꿈 뒤에 오는 경우에만 그룹화를 닫는 것으로 해석됩니다. 위의 작업을 수행하려면
{ command1; command2; }
하부 쉘과의 차이 {...}
및(...)
다음 x
이 10으로 설정 되어 있지만 echo
명령이 실행 되기 전에 해당 설정이 잊혀져 있는지 확인하십시오 .
$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0
반대로 중괄호를 사용하면 설정 x=10
이 기억됩니다.
$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10
차이점은 서브 쉘이 완료된 후에 서브 쉘의 변수 지정이 지속되지 않기 때문입니다.
선적 서류 비치
보낸 사람 man bash
:
(명부)
리스트는 서브 쉘 환경에서 실행됩니다 (아래 명령 실행 환경 참조). 쉘 환경에 영향을주는 변수 할당 및 내장 명령은 명령이 완료된 후에도 유효하지 않습니다. 반환 상태는 list의 종료 상태입니다.
{목록; }
list는 단순히 현재 쉘 환경에서 실행됩니다. 리스트는 개행 또는 세미콜론으로 끝나야합니다. 이것을 그룹 명령이라고합니다. 반환 상태는 list의 종료 상태입니다. 메타 문자 (및)와 달리 {및}는 예약어이며 예약어를 인식 할 수있는 위치에서 발생해야합니다. 단어 분리를 일으키지 않기 때문에 공백이나 다른 쉘 메타 문자로 목록에서 분리해야합니다.
[공포도 추가]