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


12

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

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

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

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

if [ "$PS1" ]; then

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

답변:


12

이것은 확실히 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있습니다.


1
bash 및 dash 맨 페이지는이 구문 (홀수)을 언급하지 않기 때문에 불완전합니다.
Gregor

1
@Gregor 두 매뉴얼 모두 이것을 언급합니다. Bash 매뉴얼에서는 매개 변수 확장 목록 앞의 단락에 있고 Dash 매뉴얼에서는 다음 단락에 있습니다.
Kusalananda

1
좋아, "콜론 생략 ...."나는 그것을 보지 못했다 :(
Gregor

zsh콜론을 생략하는 것만 기록하는 것이 아니라 콜론이없는 변형을 명시 적으로 언급하는 유일한 쉘입니다.
chepner

1
POSIX의 텍스트 @pts는 "null"이라는 용어를 거의 독점적으로 사용하는데, 이는 매뉴얼 페이지에서의 사용법을 설명 할 수 있습니다.
ilkkachu

23

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

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

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

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

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


따옴표로 묶었으므로와 같으며 "$PS1", PS1비어 있으면 비어 있고 따옴표는 단어가 완전히 사라지지 않도록하기 때문입니다.
ilkkachu

4
그래서 오랫동안 같이 set -u유효하지 않습니다. nounset 옵션이 켜져 있으면 "$ PS1"=>에서 오류가 발생합니다. "$ {PS-}"는 그렇지 않습니다.

@RakeshSharma 좋은 지적입니다. 다른 구문은 실제로 nounset 옵션에 따라 다른 결과를 낼 수 있으므로 테스트 [ "$ {parameter-}"]가 더 정확할 것입니다!
Gregor

1
@ Kusalananda : NULL이 아닌 경우 ${parameter:-word}값을 사용합니다 $parameter. 다른 모든 경우 (의미 : set but NULL 또는 unset) 의미합니다 word. 당신의 표현 :if its set or null

@ikkachu : 네 맞습니다. 변수가 set AND nonnull=> 자체 인 경우에만 , 그렇지 않으면 ( set but NULL OR unset) => 단어를 사용하십시오.

6

문법 :

${parameter:-word}

그리고 특별한 형태 :

${parameter-word}

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


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

${parameter-}

과:

$parameter

또는:

${parameter}

동일합니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.