If then 문에서 특수 쉘 변수를 사용하는 방법

If then 문에서 특수 쉘 변수를 사용하는 방법

$?저는 스크립팅을 처음 접했고 grep 명령이 성공했는지 확인하기 위해 값을 확인하는 방법을 배우고 싶습니다 .만약에grep 명령은 다음과 같습니다.실패하다,그 다음에다음 값을 포함하는 메시지를 에코합니다.$name. 이를 달성하려면 If 문과 특수 쉘 변수를 사용할 수 있다는 것을 알고 있지만 올바른 구문은 모릅니다. 아래 코드로 시도해 보았습니다.

name=$1
         if [ "$name" =  "" ]
         then  echo -n "Name 'DBS' is not in directory"
            read name
         fi

grep -i $name mike ~admin/dbs/email
grep -i goodman ~admin/dbs/passwd

답변1

이것은 상당히 일반적인 구문입니다. 더 많은 오류 검사를 수행할 수 있지만 원하는 작업 범위 내에서 이것이 올바른 방향으로 갈 수 있을 것이라고 믿습니다.

#!/bin/bash

file=/etc/hosts

if [ -z "$1" ]; then
    echo Usage: $0 name 1>&2
    exit 2
fi

if grep -q "$1" $file ; then
    echo "$file" contains $1
else
    echo "$file" doesn\'t contain $1
fi

노트

  • test첫 번째 ( ) 는 (첫 번째 명령줄 인수)가 빈 문자열(또는 제공되지 않은 경우)인 경우 if [ -z "$1" ]; then ...true입니다 .$1
  • 이 줄은 다음으로 Usage:출력됩니다 .stderr1>&2
  • 출력 자체는 grep숨겨집니다(보고 싶은 오류 출력 제외). 이 경우에는 출력이 성공했는지(일치 항목을 찾았는지)만 알고 싶기 때문입니다.
    • grep모든 출력을 무음으로 설정하는 매개변수가 있습니다 -q. 이는 여기서 더 나은 옵션이지만 모든 명령에 "조용함" 스위치가 있는 것은 아닙니다. 이러한 경우 >/dev/null아래 예에 표시된 것처럼 사용할 수 있습니다.

구체적인 예와$?

구체적으로 예시를 요청하셨습니다 $?. if grep ...위의 구성 대신에 이를 별도의 명령문으로 나눌 수 있습니다.

# grep -q "$1" $file would work just as well, here (better, maybe!):
grep "$1" $file >/dev/null

if [ $? -eq 0 ]; then
    echo "$file" contains $1
else
    echo "$file" doesn\'t contain $1
fi

$?다른 명령(일부 쉘 내장 기능 제외)을 사용하면 값을 덮어쓰게 되므로 문제의 명령 직후에 테스트를 실행해야 한다는 점에 유의하는 것이 중요합니다 .

무엇인가요$?

$?셸에서 실행한 마지막 프로세스(명령)의 종료 코드입니다. 관례적으로 0종료 코드는 성공을 나타냅니다(대부분의 관례와 마찬가지로 예외도 있습니다). 더 높은 종료 코드는 다양한 응용 프로그램별 의미를 가질 수 있지만대개0이 아닌 값은 일종의 비정상적인 종료를 나타냅니다. 자세한 내용은 이 명령에 대한 설명서를 참조하세요.

추가 읽기

테스트(1)

답변2

if 문도 피하지만 매우 훌륭하고 짧은(oneliner!) 또 다른 빠른 방법은 다음 $?과 같습니다.

grep -q $name $file || echo "$name not found."

echo반품 하려는 경우 grep:0

grep -q $name $file && echo "$name found."

그리고 if-else-statemet처럼:

grep -q $name $file && echo "$name found." || echo "$name not found."

관련 정보