Bash에서 변수 할당에 "${a:-b}"를 사용하고 "a" 명령을 사용할 수 있나요?

Bash에서 변수 할당에 "${a:-b}"를 사용하고 "a" 명령을 사용할 수 있나요?

나는 bash 스크립트를 작성 중입니다.

모든이 원본 게시물var가 설정되지 않았거나 비어 있는 경우 c=${a:-b}변수를 설정하는 데 이 방법을 사용할 수 있다는 것을 배웠습니다.ca

이 상황을 확장하여 명령의 출력을 변수에 할당할 수 있는지 궁금합니다. 예를 들어 bash 명령이 있고 some command이를 var에 할당할 수 있습니다.c

c=$(some command)

some command그러나 c의 출력이 비어 있는 경우 c에 다른 기본값을 할당하는 경우도 포함하고 싶습니다 .

Bash 스크립트에서 일반 코드를 작성할 수 있다는 것을 알고 있지만 if-else좀 더 우아한 비슷한 방법이 있는지 궁금합니다 c=${a:-b}.

답변1

zsh에서는 다음을 수행할 수 있습니다.

var=${$(cmd):-default}

그러나 bash를 포함한 모든 POSIX 유사 셸에서는 언제든지 다음을 수행할 수 있습니다.

var=$(cmd)
var=${var:-default}

또는

: "${var:=default}"

종료 상태는 손실되지만 단계 사이에 변수에 저장할 수 있습니다.

var=$(cmd)
exit_status=$?
: "${var:=default}"

다음을 수행할 수도 있습니다.

var=$(cmd) exit_status=$? || var=default

For가 실패 하면 $var설정됩니다 (무언가 출력 여부에 관계 없음).defaultcmd

cmd출력이 비어 있지 않지만 줄 바꿈만 포함하는 경우 명령 대체로 막대는 여전히 비어 있습니다 var=$(cmd).$var모두후행 개행 문자. bash또한 모든 NUL 문자를 제거합니다. zsh그것들을 그대로 두면 다른 쉘은 첫 번째 NUL 문자 이후의 모든 것을 제거합니다. yash로케일에서 유효한 문자의 바이트 시퀀스를 형성하지 못하면 차단됩니다.

GNU(또는 텍스트가 아닌 입력을 처리할 수 있고(수정이 아닌) 처리할 수 있고 구분되지 않은 줄을 무시하지 않는 구현)를 사용하여 의 출력이 비어 있지 않은 경우에만 으로 설정하려면 $var다음을 수행할 수 있습니다.defaultcmdgrep

var=$(cmd | grep '^') || var=default

grep '^'where가 입력에서 최소한 줄의 시작 부분을 찾은 경우(그리고 전체 입력을 방해 없이 출력으로 전달하는 경우) true를 반환합니다.

이 경우 cmd종료 상태가 손실됩니다. NUL 또는 개행 문자만 출력하면 $var아무것도 출력되지 않을 수 있습니다.cmd

관련 정보