다음이 포함된 스크립트를 보고 있습니다.
if [ "${PS1-}" ]; then
이 후행은 -
Posix나 Bash 표준 구문을 따르지 않는 것 같아서 약간 짜증이 납니다. 이것은 항상 존재하는 구문 미스터리입니까, 아니면 철자 오류입니까? 표준/문서에 대한 참조는 크게 감사하겠습니다.
일반적으로 다음과 같이 코딩합니다.
if [ "$PS1" ]; then
어느 것이 더 정확합니까? 아니면 둘 사이에 차이가 있습니까?
답변1
변수 확장이 ${parameter:-word}
설정되고 null이 아닌 경우(빈 문자열 아님) 사용할 값입니다. 그렇지 않으면 문자열이 사용됩니다.$parameter
word
생략하면 :
값이 비어 있는지 여부는 테스트되지 않고 설정되지 않았는지 여부만 테스트됩니다.
즉, 설정되면 ${PS1-}
값으로 확장되지만, 비어 있거나 설정되지 않으면 빈 문자열로 확장됩니다. $PS1
이 경우에는정확히 똑같다${PS1:-}
다음 문자열 도 비어 있기 때문입니다 -
.
"${PS1-}"
@Rakesh Sharma가 지적했듯이 과 사이의 차이는 "$PS1"
미묘합니다. 둘 다 값으로 확장되거나 $PS1
설정되지 않은 경우 빈 문자열로 확장됩니다. 활성 상태 일 때는 예외입니다 set -u
.이 경우 설정되지 않은 변수를 확장하면 오류가 발생합니다.. 설정의 (빈) 기본값은 "${PS1-}"
이를 우회하여 unset을 PS1
오류 없이 빈 문자열로 확장합니다.
이것은 표준 구문입니다.(Bourne Shell은 1970년대 후반에 시작되었습니다.) 및 기타 유사한 확장 기능이 있습니다.
답변2
이건 확실히POSIX 구문. 정의:
다음과 같은 경우 를 사용하세요 ${parameter-word}
.parameter
- null이 아닌 값을 설정한 후 값을 바꿉니다
parameter
. - null로 설정된 다음 null을 대체하고
- 설정을 해제하고 교체하세요
word
.
세션 예:
$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"
$ parameter=value
$ echo "${parameter-word}"
value
여기서 "Null"은 단순히 빈 문자열을 나타냅니다. 예를 들어 SQL과 달리 POSIX 셸에는 특별한 null 값이 없습니다.
이 내용은 "매개변수 확장" 섹션에도 설명되어 있습니다 man bash
.
답변3
문법:
${parameter:-word}
그리고 특별한 형태:
${parameter-word}
~이다POSIX 셸의 유효한 구문word
, parameter
설정되지 않았거나 null인 경우 기본값을 사용함을 의미합니다.
일반적으로 with word
가 비어 있으면 다음과 같습니다.
${parameter-}
그리고:
$parameter
또는:
${parameter}
동등합니다.
그러나 의 영향으로 set -u
설정되지 않은 변수가 있으면 쉘이 종료됩니다. ${parameter-}
이 엄격한 규칙을 우회하는 데 사용됩니다. 두 경우 모두에서 작동하므로 이것이 더 올바른 접근 방식입니다.