grep이 아무것도 반환해서는 안 되지만 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

어떤 도움이라도 대단히 감사하겠습니다. 이것은 매우 간단할 수 있습니다...감사합니다

답변1

이는 귀하가 의심하는 것일 수 있으며 작은 변경 하나만으로 해결할 수 있습니다. 다음을 시도해 보십시오.

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...그러나 테스트에 따르면 "// }"항상 0이 아니며 두 개의 슬래시, 공백 및 중괄호로 구성된 문자열입니다. 따라서 거기에 0이 아닌 값이 있는 것이 있기 때문에 에 then일치하는 항목이 없더라도 해당 섹션이 트리거되는 이유입니다 $image. 따라서 그것을 제거하면 // }작동합니다.

답변2

또 다른 옵션은 다음과 같습니다.

if [[ -n "$image" ]]; then

$image변수에 다음 이외의 항목만 포함되어 있는지 확인하세요 .! -z ...

답변3

해당 디렉토리에서 각각 실행(+테스트 및 에코) 중입니다. 그다지 효율적이지는 않습니다. 다음과 같은 옵션을 통해 모든 작업을 직접 수행 exiftool할 수 있습니다 .grep.jpg
exiftool-if EXPR

exiftool -q -s3 -if '$tag=~/pattern/' -filename ./*.jpg

-q(이것은 -quiet 및 -short 출력 형식과 결합됩니다 -s[NUM]. 값만 인쇄됩니다. 자세한 내용은 설명서를 참조하세요.)
따라서 특정 경우 전체 스크립트를 다음으로 바꿀 수 있습니다.

exiftool -q -s3 -if \$Exif:XPKeywords=~/"$1"/ -filename specim/*.jpg

test.sh예를 들어 다음 값을 사용하는 4개의 테스트 파일이 포함된 스크립트를 실행합니다 XPKeywords.

exiftool -Exif:XPKeywords specim/*.jpg
======== specim/1.jpg
XP Keywords                     : xname;real
======== specim/2.jpg
XP Keywords                     : yname;different
======== specim/3.jpg
XP Keywords                     : wname;true
======== specim/4.jpg
XP Keywords                     : wname;unreal
    4 image files read

실행 test.sh real결과:

1.jpg
4.jpg

그리고 test.sh unreal다음을 반환합니다:

4.jpg

답변4

grepgrep의 종료 상태는 일치 여부인데, 왜 grep의 출력을 캡처한 다음 비어 있는지 확인하기 위해 문자열로 테스트합니까? 넌 할 수있어

if exiftool -EXIF:XPKeywords $f | grep -q "$1" ; then
    echo $f
fi

당신이 할 의향이 있다면.

관련 정보