아무것도 반환하지 않거나 null을 반환하는 명령의 출력을 어떻게 에코합니까?

아무것도 반환하지 않거나 null을 반환하는 명령의 출력을 어떻게 에코합니까?

아무것도 반환하지 않는 명령의 출력에서 ​​무언가를 에코하고 싶습니다.

fnames.txt의 내용입니다.

company_TOYOTA_666_696969696*
company_FORD_123_435345666*
company_MAZDA_333_333333333*
company_HONDA_777_777777777*
company_FERARI_999_999999999*

fnames.txt의 한 줄에서 각 파일을 찾는 스크립트는 다음과 같습니다.

#!/bin/sh

while read -r LINE
do
    output=$(find . -name "$LINE")

    if [[ $output ]];
    then
            printf "$output\n"
    elif [[ $output -eq 0 ]];
    then
            echo "$LINE Not Found"
    fi
done < /path/to/fnames.txt

하지만 실행하려고 하면 찾은 파일만 출력하고 찾을 수 없는 파일 이름을 에코하는 elif 문은 출력하지 않습니다.

./company_TOYOTA_666_696969696_11_22_33_4542352345.dat
./company_FORD_123_435345666_11_22_33_4542352345.dat
./company_MAZDA_333_333333333_11_22_33_4542352345.dat
./company_HONDA_777_777777777_11_22_33_4542352345.dat

다음과 같이 출력하고 싶습니다.

./company_TOYOTA_666_696969696_11_22_33_4542352345.dat
./company_FORD_123_435345666_11_22_33_4542352345.dat
./company_MAZDA_333_333333333_11_22_33_4542352345.dat
./company_HONDA_777_777777777_11_22_33_4542352345.dat
company_FERARI_999_999999999* Not Found

답변1

-z-n문자열 테스트 연산자를 사용할 수 있습니다 .

String operators:

  -z STRING      True if string is empty.

  -n STRING
     STRING      True if string is not empty.

예를 들어

while read -r LINE; do 
  output=$(find . -name "$LINE")
  if [[ -z "$output" ]]; then 
    echo "$LINE not found"
  else 
    echo "$output"
  fi
done < fnames.txt 
company_TOYOTA_666_696969696* not found
./company_FORD_123_435345666asdfgh
company_MAZDA_333_333333333* not found
./company_HONDA_777_7777777771242jkk
company_FERARI_999_999999999* not found

어디

$ ls -1 company*
company_FORD_123_435345666asdfgh
company_HONDA_777_7777777771242jkk

답변2

삶을 더 쉽게 만들기 위해 코드를 활용하고 반환하는 것이 좋습니다 grep.

while read -r LINE
do
    find . -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"

done < /path/to/fnames.txt

작동 원리:

  • find . -name "${LINE}"당신도 이것을 알고 있을 것입니다. 현재 디렉토리에서 일치하는 파일을 찾습니다.${LINE}
  • | grep "${LINE}"출력 을 grep. 일치하는 항목이 find있으면 grep일치 항목이 인쇄되고 명령은 0을 반환합니다. 일치하는 항목이 없으면 아무것도 인쇄되지 않고 0이 아닌 반환 값이 반환됩니다.

  • || echo "${LINE} not found"이는 ||OR 파이프이며 이전 명령 중 하나가 0이 아닌 값을 반환하면 실행됩니다. 따라서 grep0이 아닌 값이 반환되면(즉, 일치하는 파일을 찾을 수 없는 경우) 이 에코가 수행됩니다. 이전 명령이 성공하면 실행되지 않습니다.

답변3

#!/bin/bash

while read -r LINE
do
    output=$(find . -name "$LINE" 2> /dev/null)

    if [[ -z $output ]]; then
        echo  "$LINE Not Found"
    else
        echo  "$output"
    fi
done < /path/to/fnames.txt

관련 정보