$?
저는 스크립팅을 처음 접했고 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:
출력됩니다 .stderr
1>&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이 아닌 값은 일종의 비정상적인 종료를 나타냅니다. 자세한 내용은 이 명령에 대한 설명서를 참조하세요.
추가 읽기
답변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."