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。したがって、それを削除すると// }動作します。

おすすめ記事