回答:
$-
は、シェル自体、呼び出し、またはset
組み込みコマンドを使用して設定される現在のオプションフラグです。
$ echo $-
himBH
$ set -a
$ echo $-
ahimBH
"${-#*i}"
文字列削除の構文:(POSIXドキュメントから)
$ {parameter#[word]}
最小プレフィックスパターンを削除します。単語はパターンを生成するために拡張されます。パラメータ拡張により、パラメータが生成され、パターンと一致するプレフィックスの最小部分が削除されます。存在する場合、単語は引用されていない「#」で始まってはならない。
$ {parameter ## [word]}
最大のプレフィックスパターンを削除します。単語はパターンを生成するために拡張されます。パラメータの展開により、パラメータが生成され、パターンに一致するプレフィックスの最大部分が削除されます。
したがって${-#*i}
、最初の文字までの最短の文字列を削除しますi
。
$ echo "${-#*i}"
mBH
あなたのケースでif [ "${-#*i}" != "$-" ]
は、シェルがインタラクティブかどうかを確認します。
シェルパラメーターがあります$-
。私の場合:
$ echo $-
himB
${-}
は、$-
まったく${foo}
同じ$foo
です。
#*i
意味:変数値の先頭から最初を含むまで(できるだけ小さく、ここでは違いはありません)削除しますi
。
$ echo "${-#*i}"
mB
つまり、変数の値に[ "${-#*i}" != "$-" ]
あるかどうかを確認します。つまり、シェルが対話型かどうかを確認します。i
$-
言い換えれば、それは複雑で複雑な非互換の記述方法です。
case $- in
*i*) ...;;
*) ...;;
esac