「$ {-#* i}」!=「$-」とはどういう意味ですか?


37

/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}意味ですか。パラメータ拡張の定義が見つかりません${-

回答:


40

$-は、シェル自体、呼び出し、またはset組み込みコマンドを使用して設定される現在のオプションフラグです。

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

"${-#*i}"文字列削除の構文:(POSIXドキュメントから)

$ {parameter#[word]}

最小プレフィックスパターンを削除します。単語はパターンを生成するために拡張されます。パラメータ拡張により、パラメータが生成され、パターンと一致するプレフィックスの最小部分が削除されます。存在する場合、単語は引用されていない「#」で始まってはならない。

$ {parameter ## [word]}

最大のプレフィックスパターンを削除します。単語はパターンを生成するために拡張されます。パラメータの展開により、パラメータが生成され、パターンに一致するプレフィックスの最大部分が削除されます。

したがって${-#*i}、最初の文字までの最短の文字列を削除しますi

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

あなたのケースでif [ "${-#*i}" != "$-" ]は、シェルがインタラクティブかどうかを確認します。


23

シェルパラメーターがあります$-。私の場合:

$ echo $-
himB

${-}は、$-まったく${foo}同じ$fooです。

#*i意味:変数値の先頭から最初を含むまで(できるだけ小さく、ここでは違いはありません)削除しますi

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

つまり、変数の値に[ "${-#*i}" != "$-" ]あるかどうかを確認します。つまり、シェルが対話型かどうかを確認します。i$-

言い換えれば、それは複雑で複雑な非互換の記述方法です。

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

4
それはある POSIX互換ものの、。
悲しみ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.