sh에서 콜론과 달러 물음표를 결합하는 방법은 무엇입니까?

sh에서 콜론과 달러 물음표를 결합하는 방법은 무엇입니까?

"콜론"과 "달러 물음표"를 결합하여 sh스크립트에 인수가 있는지 확인하고 이를 관심 변수에 직접 할당할 수 있습니다.

cmd=${1:? "Usage: $0 {build|upload|log}"}

작동 방식과 구현 세부 정보를 어디서 찾을 수 있는지 단계별로 설명할 수 있나요? 예를 들어, stderr.

help() {
  echo $"Usage: $0 {build|upload|log}"
  exit 1
}
cmd=${1:? help}

왜 이것이 불가능합니까?

답변1

이 내용은 다음과 같습니다변수 확장:

${parameter:?word}

If parameter is null or unset, the expansion of word (or a message to that effect if word is not present) is written to the standard error and the shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.

따라서 argument스크립트가 실행되지 않으면 변수가 표준 출력에 기록 cmd되고 help셸로 반환됩니다.

그러나 읽기만 하고 실행하지는 않습니다. 백틱으로 묶으면 실행되고 Usage 함수가 실행됩니다.

help() {
  echo "Usage: $0 {build|upload|log}"
}
cmd=${1:? `help`}

불행하게도 변수 확장이 그렇게 하도록 설계되었기 때문에 이것은 여전히 ​​stderr에 나타날 것입니다.

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

cmd=${1:-help}
$cmd

관련 정보