Bash
是 ”磷小號1-‘validy_ntaxnd_怎麼做__oesitd我_F射頻__romplain’磷小號1−’在一種l一世ds是n噸一種X一種ndH這在d這和s一世噸d一世FF和rFr這米pl一種一世n’{PS1-}’ valid syn…
我正在查看具有以下內容的腳本:
if [ "${PS1-}" ]; then
這
-
讓我有點惱火,因為它似乎不是 Posix 或 Bash 標準語法。這是一些永遠存在的神秘語法,還是一個錯字?任何對標準/文件的引用將不勝感激。通常我會編碼:
if [ "$PS1" ]; then
哪個更正確或它們之間有區別?
這絕對是POSIX 語法。釋義:
使用
${parameter-word}
, 如果parameter
是
- 設置且不為空,然後替換 的值
parameter
,- 設置但為空,然後替換為空,並且
- 取消設置,然後替換
word
。範例會話:
$ echo "${parameter-word}" word $ parameter= $ echo "${parameter-word}" $ parameter=value $ echo "${parameter-word}" value
這裡的“Null”只是指空字元串。例如,與 SQL 相比,POSIX shell 中沒有特殊的空值。
這也記錄在
man bash
.
變數擴展
${parameter:-word}
將使用$parameter
if 設置且非空(不是空字元串)的值,否則將使用 stringword
。省略
:
不會測試該值是否為空,僅測試它是否未設置。這意味著如果它被設置,
${PS1-}
它將擴展到$PS1
一個空字元串,如果它是空的或未設置的。在這種情況下,這與字元串 after也是空的完全一樣。${PS1:-}``-
"${PS1-}"
正如@Rakesh Sharma 指出的那樣,和之間的區別"$PS1"
很微妙:兩者都將擴展為 的值$PS1
,或者如果未設置,則擴展為空字元串。例外是 whenset -u
處於活動狀態,在這種情況下擴展未設置的變數會導致錯誤。設置的(空)預設值"${PS1-}"
繞過了這一點,將 unset 擴展PS1
到空字元串而不會出錯。這是標準語法(起源於 70 年代後期的 Bourne shell),其他幾個類似的擴展也是如此。