次のコマンドを使用するスクリプトを理解しようとしています。set -- ${line#?}
。私はsetコマンドと中括弧を理解しています。しかし、「#?」の説明が見つかりません。部分。
答え1
${line#?}
の標準パラメータsh
拡散演算子(Kornシェルで始まる)は、単に変数から最初の文字を削除しますline
。たとえば、
$ line=abc; echo "${line#?}"
bc
より一般的${variablename#word}
には、word
スタートコンテンツvariablename
。これは…プレフィックスの削除。 word
globとして扱われます。つまり、?
すべての単一文字が一致することを意味します。
文書
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