Bash:bash関数に中括弧を引数として渡します。

Bash:bash関数に中括弧を引数として渡します。

私は次のパターンを使用してファイルを検索するのが好きです。

grep --color=auto -iRnHr --include={*.js,*.html,} --exclude-dir={release,dev,} "span" .

しかし、次のようにbashコマンドにこれを含めたいと思います。

findinfiles {*.js,*.html,} {release,dev,} "span"  // syntax is just a guessing

$1$2このタイプの中かっこを bash 関数に渡し、などと一緒に使用する方法はわかりません。以下を使用する場合:

function findinfiles() {
    echo $1, $2, $3
}

それから:

me@pc ~> findinfiles {*.js,*.html,} {release,dev,} "span"
*.js, *.html, release

もちろん、grepに引数を渡すことはこのようには機能しません。パラメーターが索引付けされているが正しくグループ化されていないようです。

この種の議論に対処する方法を教える人はいますか?

ベストアンサー1

これを実行すると、findinfiles {*.js,*.html,} {release,dev,} "span"次のことが発生します。

  1. Bashは引用符を解析し、コマンドを単語に分割しますfindinfiles{*.js,*.html,} {release,dev,} span
  2. Bashは中括弧を展開して、、、、、、およびfindinfiles単語*.jsのリストを生成します。*.htmlreleasedevspan
  3. Bashはワイルドカードパターンを一致するファイル名のリスト*.jsに展開します。*.htmlどちらのパターンにも一致するファイル名がない場合は、そのまま残ります。
  4. Bashはnameを照会し、findinfilesそれが関数であることを確認してから、指定された引数を使用して関数を実行します。

関数呼び出し時に中かっことワイルドカードの拡張を防ぐことができますが、中かっこは引数に文字通り表示されるため、特に便利ではありません。

関数呼び出しの形式を変更することをお勧めします。中かっこを使用しないでカンマのみを使用し、関数内で引数をカンマで手動で区切ります。

findinfiles () {
  local patterns="$1" excludes="$2" pattern="$3"
  shift 3
  typeset -a cmd dirs
  if [[ $# -eq 0 ]]; then dirs=(.); else dirs=("$@"); fi
  cmd=(grep --color=auto -iRnHr)
  local IFS=,
  for x in $patterns; do
    cmd+=("--include=$x")
  done
  for x in $excludes; do
    cmd+=("--exclude-dir=$x")
  done
  "${cmd[@]}" "${dirs}"
}

説明する:

  • 最初の3つのパラメータをローカル変数に保存します。追加の引数は検索するディレクトリです。
  • dirs追加パラメータのリストに設定します。それ以外の場合.(現在のディレクトリ)が使用されます。
  • コンマに設定しますIFS。スクリプト$patternsに上記のように引用されていない変数拡張が含まれている場合、$excludesシェルは次のことを行います。

    1. 変数をその値に置き換えます。
    2. にある文字が含まれるたびに、変数を別の単語に分割しますIFS。デフォルトでは、IFSスペース文字(スペース、タブ、および改行)が含まれます。
    3. 各単語をワイルドカードパターンとして処理し、一致するファイルのリストに展開します。一致するファイルが存在しない場合、パターンは保持されます。

    (これらの拡張手順を回避するには、patterns="$1"上記のスクリプトのように変数の置換に二重引用符を使用してください。)

  • この関数は、配列変数で増分実行されるようにコマンドラインを作成しますcmd。最後にコマンドが実行されます。

または、次の設定に基づいて構築することもできます。

shopt -s extglob globstar
fif_excludes='release dev'
alias fif='grep --color=auto -inH $fif_excludes'

次のコマンドを実行します。

fif span **/*.@(js|html)

説明する:

  • shopt -s extglobまたは、@(js|html)一致するワイルドカードパターンフォーマットを有効にします。 (このオプションは他のモード形式を有効にします。詳細についてはマニュアルを参照してください。)jshtml
  • shopt -s globstarすべての深さのサブディレクトリに一致するパターンを有効にします**/(たとえば、再帰巡回を実行します)。
  • 除外リスト(頻繁には発生しないと予想される)を変更するには、fif_excludes変数を変更します。

おすすめ記事