スクリプトでは、「${line#?}」とはどういう意味ですか?

スクリプトでは、「${line#?}」とはどういう意味ですか?

次のコマンドを使用するスクリプトを理解しようとしています。set -- ${line#?}。私はsetコマンドと中括弧を理解しています。しかし、「#?」の説明が見つかりません。部分。

答え1

${line#?}の標準パラメータsh拡散演算子(Kornシェルで始まる)は、単に変数から最初の文字を削除しますline。たとえば、

$ line=abc; echo "${line#?}"
bc

より一般的${variablename#word}には、wordスタートコンテンツvariablename。これは…プレフィックスの削除wordglobとして扱われます。つまり、?すべての単一文字が一致することを意味します。

文書

man bash(インタプリタbashのGNU実装はどこにありますか?sh):

${parameter#word}
${parameter##word}

一致するプレフィックスパターンを削除します。 パス名の拡張と同様に、パターンを生成するために拡張され、word以下のパターンの一致で説明されている規則を使用して、引数の拡張値と一致します。パターンがパラメータ値の先頭に一致する場合、拡張結果は、最短一致パターン(case # )または最長一致パターン(##case)が削除されたパラメータの拡張値です。引数が@orの場合、*パターン除去操作は各位置引数に順番に適用され、拡張は結果リストになります。引数が@またはで索引付けされた配列変数の場合、*パターン除去操作は配列の各メンバーに順番に適用され、拡張は結果のリストです。

ナレーター: サフィックスの削除

好きに${parameter#word}する${parameter##word}プレフィックス削除されました。シェルが提供する他の機能${parameter%word}と機能を知ることは${parameter%%word}役立ちます。サフィックス移動する。サフィックスの削除は通常、ファイル名から拡張子を削除するために使用されます。

$ name=file.jpg; echo "${name%.jpg}"
file

関連情報