Bash
即使 grep 不應該返回任何內容,Bash 腳本條件也總是通過
我在嘗試返回一個符合參數的圖像文件時遇到問題。$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
. 因此,通過刪除// }
它應該可以工作。