grepは何も返すべきではありませんが、Bashスクリプト条件は常に渡されます。

grepは何も返すべきではありませんが、Bashスクリプト条件は常に渡されます。

パラメータと一致するイメージファイルを返すのに問題があります。 $ 1は検索パラメータであり、この場合は「実際」であり、指定されたフォルダ内の1つの画像(2つではない)のラベルです。 "./test.sh real"を呼び出すと、1つではなく2つの画像が印刷されます。関数の戻り値を変数および/または条件文に設定する操作を処理する必要があるようですが、わかりません。

#!/bin/bash
for f in specim/*.jpg
do
    image=$(exiftool -EXIF:XPKeywords $f | grep "$1")
    if [[ !  -z  "$image// }"  ]]; then
    echo $f
fi

返される内容:

../../test.sh real
specim/image2.jpg
specim/image.jpg

このbashスクリプトは私が欲しいものを印刷します。 2つではなく1つの画像のみを印刷します(私が望んでいないEXIFtool項目ですが、これは単なるテストです)。

#!/bin/bash
for f in *.jpg
do
    exiftool -EXIF:XPKeywords $f | grep $1
done

結果:

./test2.sh real
XP Keywords                     : name;real

どんな助けでも大変感謝します。これはとても簡単かもしれません...ありがとう

答え1

これはあなたが疑うことであり、小さな変更だけで解決することができます。以下を試してください。

if [[ !  -z  "$image"  ]]; then

説明する

Exiftool と grep が一致した場合、変数$imageに次のものが含まれているとします。

abcabcabc

ただし、出力がない場合は、次$imageが含まれます。 (何もなし)

テスト条件には以下が含まれます。

if [[ !  -z  "$image// }"  ]]; then

したがって、最初のケースでは、bashは次のことを確認します。

if [[ !  -z  "abcabcabc// }"  ]]; then

しかし、2番目のケースでは、bashは次のことを確認します。

if [[ !  -z  "// }"  ]]; then

if "// }" is NOT zero-value, then...しかし、テストによると、"// }"常にゼロではなく、2つのスラッシュ、スペース、および中括弧で構成される文字列です。したがって、そこにゼロ以外の値があるものがあるため、then一致する項目がなくてもそのセクションがトリガーされる理由です$image。したがって、それを削除すると// }動作します。

答え2

別のオプションは次のとおりです。

if [[ -n "$image" ]]; then

$image変数に次の項目以外が含まれていることを確認してください。! -z ...

答え3

そのディレクトリでそれぞれ実行(+テストとエコー)中です。それほど効率的ではありません。次のオプションを使用して、すべての操作を直接実行exiftoolできます。grep.jpg
exiftool-if EXPR

exiftool -q -s3 -if '$tag=~/pattern/' -filename ./*.jpg

-q(これは-quietおよび-short出力形式と組み合わせられています-s[NUM]。値のみが印刷されます。詳細についてはドキュメントを参照してください。)
したがって、特定の場合はスクリプト全体を次のように置き換えることができます。

exiftool -q -s3 -if \$Exif:XPKeywords=~/"$1"/ -filename specim/*.jpg

test.shたとえば、次の値を使用する4つのテストファイルを含むスクリプトを実行しますXPKeywords

exiftool -Exif:XPKeywords specim/*.jpg
======== specim/1.jpg
XP Keywords                     : xname;real
======== specim/2.jpg
XP Keywords                     : yname;different
======== specim/3.jpg
XP Keywords                     : wname;true
======== specim/4.jpg
XP Keywords                     : wname;unreal
    4 image files read

実行test.sh real結果:

1.jpg
4.jpg

そして、test.sh unreal次を返します。

4.jpg

答え4

grepgrepの終了状態は一致するのですが、なぜgrepの出力をキャプチャしてから空であるかを確認するために文字列でテストするのですか?あなたはできます

if exiftool -EXIF:XPKeywords $f | grep -q "$1" ; then
    echo $f
fi

やる意思があれば。

関連情報