“$ {PS1-}”은 유효한 구문이며 일반“$ PS1”과 어떻게 다릅니 까? 후행 -은 Posix 나 Bash

나는 다음을 가진 스크립트를보고있다 :

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

그 후행 -은 Posix 나 Bash 표준 구문처럼 보이지 않기 때문에 약간의 버그가 있습니다. 영원히 사용되어 왔던 오묘한 구문입니까, 아니면 오타입니까? 표준 / 문서에 대한 언급이 있으면 감사하겠습니다.

일반적으로 코드를 작성합니다.

if [ "$PS1" ]; then

어느 것이 더 정확하거나 차이점이 있습니까?



답변

이것은 확실히 POSIX 구문 입니다. 역설 :

사용 ${parameter-word}하는 경우 parameter입니다

  • 설정하지 NULL, 다음의 값을 대체 parameter,
  • null로 설정 한 다음 null로 대체하고
  • 설정을 해제 한 다음 대체하십시오 word.

세션 예 :

$ echo "${parameter-word}"
word
$ parameter=
$ echo "${parameter-word}"

$ parameter=value
$ echo "${parameter-word}"
value

여기서 “널”은 단순히 빈 문자열을 의미합니다. 예를 들어 SQL과 달리 POSIX 셸에는 특수 null 값이 없습니다.

이 내용은의 “매개 변수 확장”섹션에 설명되어 man bash있습니다.


답변

변수 확장 ${parameter:-word}$parameter설정된 경우 null이 아닌 값 (빈 문자열 아님) 의 값을 사용하고 그렇지 않으면 문자열을 사용합니다 word.

를 생략하면 :값이 비어 있는지 테스트되지 않으며 값이 설정되어 있지 않은지 여부 만 있습니다.

즉 , 설정되어 있으면 ${PS1-}값으로 확장 $PS1되지만 비어 있거나 설정되어 있지 않으면 빈 문자열로 확장됩니다. 이 경우이는 정확히 같은 같은 ${PS1:-}문자열이 이후로 -또한 비어 있습니다.

의 차이 "${PS1-}"와는 "$PS1"@Rakesh 샤르마 노트로, 미묘 : 모두의 값으로 확장됩니다 $PS1이 설정되지 않은 경우 빈 문자열로, 또는. set -u활성화 되지 않은 경우 는 예외입니다 .이 경우 설정되지 않은 변수를 확장하면 오류가 발생합니다 . 이 설정에 의해 설정된 (빈) 기본값은 "${PS1-}"이 를 방지하고 PS1오류없이 빈 문자열로 설정 을 확장합니다 .

이것은 몇 가지 다른 유사한 확장과 마찬가지로 표준 구문입니다 ( 70 년대 후반 Bourne 쉘에서 시작 ).


답변

문법 :

${parameter:-word}

그리고 특별한 형태 :

${parameter-word}

는 IS POSIX 쉘 유효한 구 디폴트 값을 사용하는 수단 word경우 parameter해제 또는 널 (null)된다.


일반적으로 with word가 비어 있으면 다음을 수행하십시오.

${parameter-}

과:

$parameter

또는:

${parameter}

동일합니다.

그러나의 영향으로 set -u모든 설정되지 않은 변수로 인해 쉘이 종료됩니다. ${parameter-}엄격한 규칙을 무시하는 데 사용됩니다. 두 경우 모두 작동하므로 더 올바른 방법입니다.