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)
任何帮助将不胜感激,这可能非常简单......谢谢
可能正如您所怀疑的那样,只是要修复一个小改动,请尝试:
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
. 所以通过删除// }
它应该可以工作。