나는 bash 스크립트를 작성 중입니다.
모든이 원본 게시물var가 설정되지 않았거나 비어 있는 경우 c=${a:-b}
변수를 설정하는 데 이 방법을 사용할 수 있다는 것을 배웠습니다.c
a
이 상황을 확장하여 명령의 출력을 변수에 할당할 수 있는지 궁금합니다. 예를 들어 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
설정됩니다 (무언가 출력 여부에 관계 없음).default
cmd
cmd
출력이 비어 있지 않지만 줄 바꿈만 포함하는 경우 명령 대체로 막대는 여전히 비어 있습니다 var=$(cmd)
.$var
모두후행 개행 문자. bash
또한 모든 NUL 문자를 제거합니다. zsh
그것들을 그대로 두면 다른 쉘은 첫 번째 NUL 문자 이후의 모든 것을 제거합니다. yash
로케일에서 유효한 문자의 바이트 시퀀스를 형성하지 못하면 차단됩니다.
GNU(또는 텍스트가 아닌 입력을 처리할 수 있고(수정이 아닌) 처리할 수 있고 구분되지 않은 줄을 무시하지 않는 구현)를 사용하여 의 출력이 비어 있지 않은 경우에만 으로 설정하려면 $var
다음을 수행할 수 있습니다.default
cmd
grep
var=$(cmd | grep '^') || var=default
grep '^'
where가 입력에서 최소한 줄의 시작 부분을 찾은 경우(그리고 전체 입력을 방해 없이 출력으로 전달하는 경우) true를 반환합니다.
이 경우 cmd
종료 상태가 손실됩니다. NUL 또는 개행 문자만 출력하면 $var
아무것도 출력되지 않을 수 있습니다.cmd