Bash

是 ”磷小號1-‘validy_ntaxnd_怎麼做__oesitd我_F射頻__romplain’磷小號1−’在一種l一世ds是n噸一種X一種ndH這在d這和s一世噸d一世FF和rFr這米pl一種一世n’{PS1-}’ valid syn…

  • March 18, 2017

我正在查看具有以下內容的腳本:

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}將使用$parameterif 設置且非空(不是空字元串)的值,否則將使用 string word

省略:不會測試該值是否為空,僅測試它是否未設置。

這意味著如果它被設置,${PS1-}它將擴展到$PS1一個空字元串,如果它是空的或未設置的。在這種情況下,這與字元串 after也是空的完全一樣${PS1:-}``-

"${PS1-}"正如@Rakesh Sharma 指出的那樣,和之間的區別"$PS1"很微妙:兩者都將擴展為 的值$PS1,或者如果未設置,則擴展為空字元串。例外是 whenset -u處於活動狀態,在這種情況下擴展未設置的變數會導致錯誤。設置的(空)預設值"${PS1-}"繞過了這一點,將 unset 擴展PS1到空字元串而不會出錯。

這是標準語法起源於 70 年代後期的 Bourne shell),其他幾個類似的擴展也是如此。

引用自:https://unix.stackexchange.com/questions/352110