나는 다음을 가진 스크립트를보고있다 :
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-}
엄격한 규칙을 무시하는 데 사용됩니다. 두 경우 모두 작동하므로 더 올바른 방법입니다.