파라미터 확장
분명한 대답은 특수한 형태의 매개 변수 확장 중 하나를 사용하는 것입니다.
: ${STATE?"Need to set STATE"}
: ${DEST:?"Need to set DEST non-empty"}
또는 더 좋습니다 (아래의 '큰 따옴표 위치'섹션 참조).
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
첫 번째 변형 ( ?
) 만 사용 하려면 STATE를 설정해야하지만 STATE = ""(빈 문자열)은 정상입니다. 정확히 원하는 것이 아니라 대체 및 이전 표기법입니다.
두 번째 변형 (을 사용 :?
)은 DEST가 설정되고 비어 있지 않아야합니다.
메시지를 제공하지 않으면 쉘은 기본 메시지를 제공합니다.
${var?}
구조는 버전 7 UNIX 및 Bourne 쉘 (1978 또는 그 부근)에 이식 돌아왔다. 이 ${var:?}
구성은 약간 더 최신입니다. 1981 년경 System III UNIX에 있었지만 그 전에는 PWB UNIX에 있었던 것 같습니다. 따라서 Korn 쉘 및 특히 Bash를 포함한 POSIX 쉘에 있습니다.
일반적으로 쉘의 매뉴얼 페이지에 Parameter Expansion 이라는 섹션에 설명되어 있습니다. 예를 들어, bash
매뉴얼은 다음 과 같이 말합니다.
${parameter:?word}
널 또는 설정되지 않은 경우 오류 표시 매개 변수가 널 (NULL)이거나 설정되지 않은 경우, 단어 확장 (또는 단어가없는 경우 해당 효과에 대한 메시지)이 표준 오류에 기록되고 쉘이 대화식이 아닌 경우 종료됩니다. 그렇지 않으면 매개 변수 값이 대체됩니다.
콜론 사령부
콜론 명령은 단순히 인수를 평가 한 다음 성공한다고 덧붙여 야합니다. 원래 쉘 주석 표기법입니다 ( ' #
' 이전 줄 끝). 오랫동안 Bourne 쉘 스크립트에는 첫 문자로 콜론이있었습니다. C 셸은 스크립트를 읽고 첫 번째 문자를 사용하여 C 셸 ( ' #
'해시) 또는 Bourne 셸 ( ' :
'콜론) 에 해당하는지 확인합니다 . 그런 다음 커널은 행동을 #!/path/to/program
취하고 ' '에 대한 지원을 추가 했으며 Bourne 쉘은 ' #
'의견을 얻었 으며 콜론 규칙은 길가에있었습니다. 그러나 콜론으로 시작하는 스크립트를 발견하면 이유를 알 수 있습니다.
큰 따옴표의 위치
blong 는 의견을 물었다 :
이 토론에 대한 의견이 있으십니까? https://github.com/koalaman/shellcheck/issues/380#issuecomment-145872749
토론의 요지는 :
… 그러나 shellcheck
(버전 0.4.1)이 메시지가 나타납니다.
In script.sh line 13:
: ${FOO:?"The environment variable 'FOO' must be set and non-empty"}
^-- SC2086: Double quote to prevent globbing and word splitting.
이 경우 내가해야 할 일에 대한 조언이 있습니까?
짧은 대답은 " shellcheck
제안대로"입니다.
: "${STATE?Need to set STATE}"
: "${DEST:?Need to set DEST non-empty}"
이유를 설명하기 위해 다음을 연구하십시오. 점을 유의 :
명령 인수를 (하지만 쉘이 인수를 평가 않음) 에코하지 않습니다. 우리는 인수를보고 싶기 때문에 아래 코드 printf "%s\n"
는 대신에 사용 됩니다 :
.
$ mkdir junk
$ cd junk
$ > abc
$ > def
$ > ghi
$
$ x="*"
$ printf "%s\n" ${x:?You must set x} # Careless; not recommended
abc
def
ghi
$ unset x
$ printf "%s\n" ${x:?You must set x} # Careless; not recommended
bash: x: You must set x
$ printf "%s\n" "${x:?You must set x}" # Careful: should be used
bash: x: You must set x
$ x="*"
$ printf "%s\n" "${x:?You must set x}" # Careful: should be used
*
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
abc
def
ghi
$ x=
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
bash: x: You must set x
$ unset x
$ printf "%s\n" ${x:?"You must set x"} # Not quite careful enough
bash: x: You must set x
$
전체 표현식이 큰 따옴표로 묶이지 않은 경우 값 $x
이 먼저 확장 된 *
다음 파일 이름 목록으로 확장되는 방법에 유의하십시오 . 이것이 shellcheck
권장되는 사항입니다. 표현식이 큰 따옴표로 묶인 양식에 반대하지 않는지 확인하지는 않았지만 괜찮을 것이라는 합리적인 가정입니다.