2017-02-01 4 views
0

私はコマンドに値を渡したい変数を持っています。しかし、$は珍しい結果を生み出しています。 *のように動作し、すべてのディレクトリを検索しているようです。私のコードは:bashの値をコマンドに渡す

"Please enter the test type: " 
read test 

result="pass" 
search_result=`find ./logs/$test_2017_01_logs*/* -type f -name func_log -exec egrep $result {} \;` 

echo "$search_result" 

私のコードが行っているディレクトリではなく、ユーザーが読み込んだディレクトリサフィックスを検索したいだけです。

渡された値($ test)と残りのフォルダ名(_2017_01_logs *)の連結による問題ですか?

答えて

2

_は「単語文字」([a-zA-Z0-9_])で、あなたがアドレス指定している変数の一部として理解されています。つまり、未定義の$test_2017_01_logsです。これを避けるために

、あなたは中括弧で変数名を囲むことができます。

find ./logs/"${test}_2017_01_logs"*/* -type f -name func_log -exec egrep $result {} \; 

それとも、私たちはチャールズ・ダフィーのよくアドバイスヒント従っている場合:

find ./logs/"$test"_2017_01_logs*/* -type f -name func_log -exec egrep -h -e "$result" /dev/null {} + 
+1

も前後に引用符を追加したい場合があります'$ result'は、単語分割されないようになります(最初の単語を超える単語は追加のファイル名として解釈されます)。 –

+2

私は '-exec egrep -h -e" $ result "/ dev/null {} +'を提案します。これは、grepを必要以上に実行しないようにするためです。 '-e'の直前)は、' result'をダッシュ​​で始まっていてもリテラル文字列として解釈します。 ( '-h'は出力のファイル名を抑制し、複数の名前が渡された場合でも現在の使用法と同等の動作をします;望むならそれを取り出してください)。 –

+2

... '/ dev/null'はそこにあります。' grep'はいくつの場合にいくつのファイル名が渡されるかに基づいて動作が変わるからです。それが存在すると、コマンドラインに追加される結果の数が多くても、一貫した動作が保証され、イディオムが 'xargs'で再利用されると、インプリメンテーションでstdinからインスタンスを読み込むことはありません結果が0件のケース(IIRC、MacOSの実装はこれらの1つです)で呼び出します。 –

関連する問題