2011-08-08 12 views
1

これは私の問題です。ファイルGC.xmlがどこにあるディレクトリのリストを取得するには、次のBashスクリプト:変数のフォルダのリストと正確なディレクトリ名をgrep

EXBRANDS=検索/ var/www/htmlと設定/ -maxdepth 3 -name "GC.xml" 型F | awkの-F '/' ';

#echo $EXBRANDS

#dir1 dir2 dir3 (it appears exactly like this)

#read var

は私がいるところだ例

のための "DIR" を入力します。' {$ 5印刷}私のディレクトリリストと比較するために入力した正確なパターンを特定するのに困っています。

echo $EXBRANDS | grep "[ $var]\|[$var ]\|[ $var]" if [[ $? -eq 0 ]] ; then ..... else ..... fi;

私は私が$ VARに値「DIR」を渡すと、私のgrepコマンドは、実際のディレクトリを検索し、$?= 0

私の願いを返すように私grepコマンドに問題があると思いますgrepコマンドでパターン$ varを正確に見つけた場合にのみ、$?= 0を取得することです...

ここで最高のgrep(egrep)オプションは何ですか?または私の方法は完全に愚かですか?

答えて

1

は、単語の境界を使用してみてください:

if [ ! -z "$var" ] ; 
    then echo $EXBRANDS | grep -e "\b$var\b"; 
    if [[ $? -eq 0 ]] ; 
     then echo "Y"; 
     else echo "N"; 
    fi; 
    else echo "input dir must be not null"; 
fi; 

EDIT:nullのチェックを追加

+0

問題を解決しましたが、$ varにEnterキーを押した場合、$?= 0 ...と考えているようです。どうすればこのケースも取り除くことができますか? – Rgonomike

+0

私は空の文字列に次のコードを実行しても意味がないので、実行を続行する前に$ varにいくつかの検証を追加してください。 * if [-z "$ var"] *でテストし、正常に終了するとエラーが発生します。 –

+0

ありがとうございます。今は完璧に動作します。 – Rgonomike

2

をごEXBRANDSは、多くの行が含まれている、あなたは、エコーでこれらの行を失います。

私は他の方法ということだろう。

read var 
find /var/www/html/ -maxdepth 3 -name "GC.xml" -type f | awk -F '/' '{print $5}' | grep "^$var\$" 
if [[ $? -eq 0 ]] ; then ... else ... fi; 

はgrepのは"^$var\$"構築物で正確なラインと一致していることを確認してください。

を編集することもできます。エコーではなくprintf "$EXBRANDS" | grep "^$var\$"でも問題が解決する可能性があります。

+0

これは動作しますが、その形式でEXBRANDSを必要としない場合にのみ有効です。 * EXBRANDS = ‘ find ... ‘ *すべてを同じ行に置く: "dir1 dir2 dir3" –

+0

あなたはそれが同じ行にあると確信していますか? 'echo $ EXBRANDS'を実行すると、パラメータの解析の前にシェル置換が行われ、パラメータの区切り文字がスペース、TABS、および改行であるため、すべてが1行で取得されるため、同じ行に表示されます。 'echo" $ EXBRANDS "を試してください。これは' echo 'や' cat << EOF $ EXBRANDS EOF'に一つのパラメータを送ります。 – jfg956

+0

あなたは正しいです、説明のためにありがとう –

関連する問題