Bash

即使 grep 不應該返回任何內容,Bash 腳本條件也總是通過

  • September 24, 2015

我在嘗試返回一個符合參數的圖像文件時遇到問題。$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

返回的內容:

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

這個 bash 腳本列印出我想要的,只有一個圖像而不是兩個(作為我不想要的 exiftool 東西,但這只是一個測試):

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

結果:

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

任何幫助將不勝感激,它可能非常簡單……謝謝

可能正如您所懷疑的,只是要修復一個小改動,請嘗試:

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

解釋

假設當 exiftool 和 grep 匹配時,您的$image變數包含以下內容:

abcabcabc

但是當沒有輸出時,$image包含:(無)

在您的測試條件下,您有:

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

因此,在第一種情況下 bash 看到了這一點:

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

但在第二種情況下,bash 看到了這一點:

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

測試是說if "// }" is NOT zero-value, then...但是"// }"總是不是零值,它是一個東西,它是一個由兩個斜杠、一個空格和一個花括號組成的字元串。因此,由於那裡有一些東西,而不是零值,這就是為什麼then即使您在$image. 因此,通過刪除// }它應該可以工作。

引用自:https://unix.stackexchange.com/questions/231670