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

関連情報