"${-#*i}" != "$-" 是什麼意思?

"${-#*i}" != "$-" 是什麼意思?

/etc/profile我看到這個:

for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null 2>&1
        fi
    fi
done

這是什麼${-#*i}意思。我找不到參數擴展的定義${-

答案1

$-是 shell 本身在呼叫時或使用set內建指令設定的目前選項標誌:

$ echo $-
himBH
$ set -a
$ echo $-
ahimBH

"${-#*i}"是字串刪除的語法:(來自POSIX 文檔

${參數#[字]}

刪除最小前綴模式。該詞應擴展以產生一種模式。然後,參​​數擴展應產生參數,其中前綴的最小部分與刪除的模式相符。如果存在,單字不得以不帶引號的「#」開頭。

${參數##[字]}

刪除最大前綴模式。該詞應擴展以產生一種模式。然後,參​​數擴展應產生參數,其中前綴的最大部分與刪除的模式相符。

因此${-#*i}刪除最短的字串直到第一個i字元:

$ echo "${-#*i}"
mBH

對於您的情況,if [ "${-#*i}" != "$-" ]檢查您的 shell 是否是互動的。

答案2

有一個shell參數$-。就我而言:

$ echo $-
himB

${-}$-完全一樣${foo}與 相同$foo

#*i意思是:從變數值的開頭刪除(盡可能少;這裡沒有區別)直到(包括)第一個i.

$ echo "${-#*i}"
mB

換句話說:檢查變數的值中[ "${-#*i}" != "$-" ]是否有an ,也就是檢查shell是否是互動的。i$-

換句話說,這是一種複雜且與 Bourne 不相容的寫作方式:

case $- in
  *i*) ...;;
  *) ...;;
esac

相關內容