Bashスクリプト一重引用符パラメータとワイルドカード値

Bashスクリプト一重引用符パラメータとワイルドカード値

構成可能なディレクトリと除外されたファイルを含むコード検索スクリプトを作成しようとしています。スクリプトの主な部分は次の行です。

out=$(grep -TInr$C$W --color=always \
    --exclude={translations} \
    --exclude-dir={build,tmp} \
    "$SEARCH")

$C$W大文字と小文字を区別せずに正確な単語一致を構成するために、スクリプトパラメータに設定された変数と$SEARCH検索文字列になる残りのパラメータのみが含まれます。しかし、特定のファイルを無視する実装はまだ効率的ではありません。

検索からファイルを除外するために、~/.codesearch_config次のファイルを試しました。

#!/bin/bash

if [[ $PWD == "$HOME/project"* ]]; then
    exclude_directories={.git,build,tmp}
    exclude_files={translations}
fi

もちろん、ここでのアイデアは、現在の作業ディレクトリに基づいて特定の除外セットがロードされることです。しかし、スクリプトに以下を追加しようとすると、次のようになります。

--exclude=$exclude_files

bashは次のように引数全体を一重引用符で囲みます(-xデバッグオプションでテスト)。

grep -TInrw --color=always '--exclude={translations}' '--exclude-dir={build,tmp}' search_term

私が望むのは拡張です--exclude-dir=build --exclude-dir=tmp。これらの変数の値を$exclude_コマンドに手動で追加すると、問題はパラメータとグローバル変数の周りに一重引用符を入れることです。これが起こらないようにするにはどうすればよいですか?

答え1

exclude-dir除外のために配列を使用し、 -- と--excludeオプションで拡張してみてください。

たとえば、スクリプトの場合~/.codesearch_config(おそらく基本スクリプトからインポートされたのでしょうか?):

#! /bin/bash

# temporary array variables
declare -a __exclude_directories
declare -a __exclude_files

if [[ "$PWD" == "$HOME/project"* ]]; then
    __exclude_directories=(.git build tmp)
    __exclude_files=(translations)
elif [[ "$PWD" == "/some/where/else" ]]; then
    __exclude_directories=(foo bar)
    __exclude_files=(abc.txt def.txt xyz.txt)
fi

exclude_directories=''
exclude_files=''

for i in "${__exclude_directories[@]}" ; do
    exclude_directories+=" --exclude-dir '$i'"
done

for i in "${__exclude_files[@]}" ; do
    exclude_files+=" --exclude '$i'"
done

unset __exclude_directories
unset __exclude_files

# comment out or delete the next two lines after you've verified
# that the output is correct.
echo $exclude_directories 
echo $exclude_files

後で次のように使用します。

out=$(grep -TInr$C$W --color=always \
      $exclude_files \
      $exclude_directories \
      "$SEARCH")

注:ここでは変数の周りに引用符はありません$exclude_*。それ以外の場合は、次のように処理されます。一つ--exclude複数のパラメータとパラメータの代わりにパラメータを使用します--exclude-dir。これは、変数が望ましくなく二重引用符で囲まれてはならない非常にまれなケースの1つです(たとえば、1つ以上の変数内でコマンドラインを構成するなど)。

ほとんどすべての場合、習慣的に変数を二重引用符で囲む必要があります。

関連情報