"${PS1-}" 유효한 구문인가요? 일반 "$PS1"과 어떻게 다른가요?

"${PS1-}" 유효한 구문인가요? 일반 "$PS1"과 어떻게 다른가요?

다음이 포함된 스크립트를 보고 있습니다.

if [ "${PS1-}" ]; then

이 후행은 -Posix나 Bash 표준 구문을 따르지 않는 것 같아서 약간 짜증이 납니다. 이것은 항상 존재하는 구문 미스터리입니까, 아니면 철자 오류입니까? 표준/문서에 대한 참조는 크게 감사하겠습니다.

일반적으로 다음과 같이 코딩합니다.

if [ "$PS1" ]; then

어느 것이 더 정확합니까? 아니면 둘 사이에 차이가 있습니까?

답변1

변수 확장이 ${parameter:-word}설정되고 null이 아닌 경우(빈 문자열 아님) 사용할 값입니다. 그렇지 않으면 문자열이 사용됩니다.$parameterword

생략하면 :값이 비어 있는지 여부는 테스트되지 않고 설정되지 않았는지 여부만 테스트됩니다.

즉, 설정되면 ${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-}이 엄격한 규칙을 우회하는 데 사용됩니다. 두 경우 모두에서 작동하므로 이것이 더 올바른 접근 방식입니다.

관련 정보