2017-04-07 24 views
0

コマンドの出力を確認し、出力に応じて異なるコマンドを実行しようとしています。Bash - コマンドの出力をキャッチ

count="1" 
for f in "[email protected]"; do 
    BASE=${f%.*} 
# if [ -e "${BASE}_${suffix}_${suffix2}.mp4" ]; then 
    echo -e "Reading GPS metadata using MediaInfo file ${count}/${#@} "$(basename "${BASE}_${suffix}_${suffix2}.mp4")" 
    mediainfo "${BASE}_${suffix}_${suffix2}.mp4" | grep "©xyz" | head -n 1 
    if [[ $? != *xyz* ]]; then 
    echo -e "WARNING!!! No GPS information found! File ${count}/${#@} "$(basename "${BASE}_${suffix}_${suffix2}.mp4")" || exit 1 
    fi 
    ((count++)) 
done 

MediaInfoは、の出力を確認しているコマンドです。それに書き込まれた ビデオファイルがある場合は、「©XYZ」原子は、出力は次のようになります。

$ mediainfo FILE | grep "©xyz" | head -n 1 
$ ©xyz          : +60.9613-125.9309/ 
$ 

は、それ以外の場合は

$ mediainfo FILE | grep "©xyz" | head -n 1 
$ 

上記のコードは動作した場合にも警告をエコー表示されませんnullであります©xyzが提示されました。 私が間違っていることのアイデアはありますか?

答えて

1

構文mediainfoコマンドの出力は、単純に間違っています。 grepを使用している場合、あなたは直接のif条件

if mediainfo "${BASE}_${suffix}_${suffix2}.mp4" | grep -q "©xyz" 2> /dev/null; 
then 
.. 

grep-qフラグはstdoutにどんな結果を投げずに黙ってコマンドを実行するように指示し、部分的にはその戻りコード($?の出力)を使用することができます2>/dev/nullは、stderrを介してスローされたエラーを抑制します。したがって、条件付きのは、文字列が存在する場合はとなり、存在しない場合はfailとなります。

0

$?は、コマンドの終了コードです。0〜255の数値です。値 "xyz"が書き込まれるstdoutとは関係ありません。

はあなただけ grepを使用することができ、標準出力に一致するには、次のキャプチャを使用している

if mediainfo "${BASE}_${suffix}_${suffix2}.mp4" | grep -q "©xyz" 
then 
    echo "It contained that thing" 
else 
    echo "It did not" 
fi 
関連する問題