명령의 종료 상태를 변수로 추출하는 방법은 무엇입니까?


14

나는 며칠 전에 배쉬를 배우기 시작했다.

다음 grep과 같은 변수로 표현 의 종료 상태를 얻으려고합니다 .

check=grep -ci 'text' file.sh

내가 얻은 결과는

No command '-ic' found

파이프 명령으로해야합니까?


6
종료 상태의 경우 $?명령이 완료된 직후 검사 할 수 있습니다 .
coffeMug

파이프 라인에서 명령 중 하나의 상태를 원하는 경우 PIPESTATUS 배열을 검사 할 수 있습니다.
cas

답변:


26

당신의 명령,

check=grep -ci 'text' file.sh

같은 쉘에 의해 해석됩니다 "명령을 실행 -ci인수로 text하고 file.sh, 변수를 설정 check값으로 grep환경에."


쉘은 가장 최근에 실행 된 명령의 종료 값을 변수에 저장 ?합니다. 다음과 같이 자신의 변수 중 하나에 값을 할당 할 수 있습니다.

grep -i 'PATTERN' file
check=$?

이 값으로 작업하려면 check변수 를 사용할 수 있습니다.

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

또는 별도의 변수를 사용하지 않고 $?모두 함께 검사 해야 할 수도 있습니다.

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

( -q, 그것은 grep무언가를 출력하지 않고 무언가가 일치하는 즉시 종료 하도록 지시 합니다. 우리는 여기서 일치하는 것에 관심이 없습니다)

또는 패턴을 찾을 수 없을 때 "일을"하려는 경우 :

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

$?다른 변수에 저장 은 다음 $?과 같이에서 값을 덮어 쓴 경우 나중에 사용해야 할 경우에만 필요합니다 .

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

위의 코드 스 니펫 $?에서 [ "$err" -ne 0 ] && [ ! -d "$dir" ]테스트 결과로 덮어 씁니다 . 여기에 저장하면 실제로 표시하고와 함께 사용해야하는 경우에만 필요합니다 exit.


4

귀하의 질문은 명확하지 않지만 제출 한 코드를 기반으로 변수 checkgrep명령 의 종료 상태를 저장하는 것처럼 보입니다 . 이 작업을 수행하는 방법은

grep -ci 'text' file.sh
check=$?

쉘에서 명령을 실행할 때 종료 상태는 특수 쉘 매개 변수를 통해 사용 가능합니다 $?.

이것은 에 대한 사양 에 POSIX (유닉스 계열 운영 체제의 표준)에 의해 문서화되어 있으며 Bash 구현은 특수 매개 변수에 문서화되어 있습니다.

새로운 학습자이므로 기본 사항을 익히려면 좋은 책 및 / 또는 온라인 자습서로 시작하는 것이 좋습니다. 외부 리소스에 대한 권장 사항은 Stack Exchange 사이트에서 권장하지 않지만 Lhunath 및 GreyCat의 Bash Guide를 제안 합니다.


4

bash에게 check=grep명령에 전달되는 환경 에서 변수를 설정하도록 지시 했습니다.

-ci 'text' file.sh

하지만 ci존재하지 않습니다.

나는 그 명령을 백 틱으로 묶거나 달러 기호 앞에 괄호로 묶어야한다고 생각합니다.이 중 하나는 파일에서 '텍스트'가 발견 된 줄 수를 대소 문자를 구분하지 않습니다.

check=`grep -ci 'text' file.sh`

check=$(grep -ci 'text' file.sh)

이제 $check어떤 경기가 있었다 전혀 일치하는 경우, 또는 긍정적 인 경우 0이어야한다.


1

출력을 확인할 때 왜 -c를 사용합니까? 성공 여부에 관계없이 일치하는 횟수를 확인하는 데 사용됩니다.

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

하지만이 예에서는

check="$(grep --silent -i 'text' file.sh; echo $?)"

종료 코드를 제외하고는 출력되지 않으며 에코됩니다. 변수 검사에서 사용하는 출력입니다. 또한 한 줄이기 때문에 선호합니다.

--silent를 -q로 바꿀 수 있습니다. grep 출력에 관심이 없기 때문에 작동하는지 여부에 관계없이 사용합니다.

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1

1

grep 명령의 출력을 변수에 지정하는 올바른 방법은 @ monty-harder가 언급 한 것입니다.

check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)

이 명령의 종료 상태를 변수에 지정하더라도 $?아래 표시된대로 명령을 실행 한 직후에 쉘 매개 변수를 사용해야합니다 .

grep -ci 'text' file.sh
check=$?
echo $check
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.