Bash 脚本条件总是通过,即使 grep 不应该返回任何内容

sou*_*ook 3 grep scripting bash exif

尝试返回一个适合参数的图像文件时遇到问题。$1 是搜索参数,在这个事件中它是“真实的”,它是给定文件夹中图像之一(不是两个)上的标签。当我称它为“./test.sh real”时会发生什么,它会打印出两个图像,而不仅仅是一个。我想它必须处理我将函数返回设置为变量和/或我的条件语句,但我不太确定。

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

返回了什么:

../../test.sh real
specim/image2.jpg
specim/image.jpg
Run Code Online (Sandbox Code Playgroud)

这个 bash 脚本打印出我想要的东西,只有一个图像而不是两个(作为我不想要的 exiftool 东西,但这只是一个测试):

#!/bin/bash
for f in *.jpg
do
    exiftool -EXIF:XPKeywords $f | grep $1
done
Run Code Online (Sandbox Code Playgroud)

结果:

./test2.sh real
XP Keywords                     : name;real
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激,这可能非常简单......谢谢

cla*_*123 5

可能正如您所怀疑的那样,只是要修复一个小改动,请尝试:

if [[ !  -z  "$image"  ]]; then
Run Code Online (Sandbox Code Playgroud)

解释

假设当 exiftool 和 grep 匹配时,您的$image变量包含以下内容:

abcabcabc
Run Code Online (Sandbox Code Playgroud)

但是当没有输出时,$image包含:(无)

在您的测试条件下,您有:

if [[ !  -z  "$image// }"  ]]; then
Run Code Online (Sandbox Code Playgroud)

因此,在第一种情况下,bash 看到的是:

if [[ !  -z  "abcabcabc// }"  ]]; then
Run Code Online (Sandbox Code Playgroud)

但在第二种情况下,bash 看到的是:

if [[ !  -z  "// }"  ]]; then
Run Code Online (Sandbox Code Playgroud)

测试是说if "// }" is NOT zero-value, then...然而"// }"它总是不是零值,它是一个东西,它是一个由两个斜杠、一个空格和一个花括号组成的字符串。因此,由于那里有一些东西,不是零值的东西,这就是为什么then即使在$image. 所以通过删除// }它应该可以工作。