構成可能なディレクトリと除外されたファイルを含むコード検索スクリプトを作成しようとしています。スクリプトの主な部分は次の行です。
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つ以上の変数内でコマンドラインを構成するなど)。
ほとんどすべての場合、習慣的に変数を二重引用符で囲む必要があります。