「${-#*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

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

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

"${-#*i}"文字列削除の構文は次のとおりです: (POSIXドキュメント

${パラメータ#[単語]}

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

${パラメータ##[単語]}

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

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

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

あなたの場合は、if [ "${-#*i}" != "$-" ]シェルが対話型かどうかを確認します。

答え2

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

$ echo $-
himB

${-}$-は と全く同じです。${foo}は と同じです$foo

#*i意味: 変数値の先頭から最初の まで ( を含む ) を ( 可能な限り少なく、ここでは違いはありません ) 削除しますi

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

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

言い換えれば、これは複雑で Bourne と互換性のない書き方です。

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

関連情報