-1

シェルスクリプトを見ていると、次のようなものが見つかりました

${var#*.}

$var が 111.txt の場合

echo ${var#*.} 

txt が返されます。これは良いことです。理由を知りたいです。ありがとうございます

4

3 に答える 3

0

${var#pattern}変数の値のパターン (先頭から始まり、最短) を見つけて削除し、残りを返します。
したがって、パターンは「. が続くもの」を意味し、「txt」が残ります。
ちなみに、${var##pattern}は最長一致パターンを削除します
var=111.111.txtその後
${var#\*.}戻り111.txt
${var##\*.}ます 戻りますtxt

于 2013-06-01T14:00:25.913 に答える
0

bashマニュアルページから:

${parameter#word}

一致するプレフィックス パターンを削除します。
単語は、パス名の展開と同様にパターンを生成するために展開されます。パターンが parameter の値の先頭と一致する場合、展開の結果は、一致する最も短いパターンが削除された parameter の展開された値になります。

于 2013-06-01T14:01:04.440 に答える
0

その理由は、文字列の一部をパターンで操作する機能は、高価なフォークやパイプを使用せずに済むため、非常に便利だからです。

  • 元の Unix Shell はそのようにしていました
  • POSIX 標準では、次のように指定されています。

${#parameter}

文字列の長さ。パラメータの値の文字数が代入されます。パラメータが「*」または「@」の場合、展開の結果は指定されていません。パラメータが設定されておらず、set -u が有効な場合、展開は失敗します。

次の 4 種類のパラメーター展開は、部分文字列処理を提供します。いずれの場合も、パターンの評価には、正規表現表記法ではなく、パターン マッチング表記法 (パターン マッチング表記法を参照) を使用する必要があります。パラメータが「#」、「*」、または「@」の場合、展開の結果は指定されていません。パラメータが設定されておらず、set -u が有効な場合、展開は失敗します。完全なパラメーター展開文字列を二重引用符で囲んでも、次の 4 種類のパターン文字が引用されることはありませんが、中括弧内の文字を引用すると、この効果が生じます。各品種において、単語を省略した場合は、空のパターンを使用するものとします。

${parameter%[word]}

最小サフィックス パターンを削除します。単語を展開してパターンを生成する必要があります。パラメーター展開は、パターンに一致するサフィックスの最小部分が削除されたパラメーターになります。存在する場合、単語は引用符で囲まれていない「%」で始まってはなりません。

${parameter%%[word]}

最大サフィックス パターンを削除します。単語を展開してパターンを生成する必要があります。パラメーター展開は、パターンに一致するサフィックスの最大部分が削除されたパラメーターになります。

${parameter#[word]}

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

${parameter##[word]}

最大プレフィックス パターンを削除します。単語を展開してパターンを生成する必要があります。パラメータ展開はパラメータになり、パターンに一致するプレフィックスの最大部分が削除されます。

于 2013-06-01T14:04:58.283 に答える