$(명령)$? 종료 코드 추가

$(명령)$? 종료 코드 추가

며칠 전부터 Bash를 배우기 시작했습니다.

grep표현식의 종료 상태를 다음과 같은 변수로 가져오려고 합니다 .

check=grep -ci 'text' file.sh

내가 얻는 결과는 다음과 같습니다.

No command '-ic' found

이 작업을 수행하려면 파이프 명령을 사용해야 합니까?

답변1

주문,

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.

답변2

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

-ci 'text' file.sh

그러나 ci그것은 존재하지 않습니다.

명령을 백틱이나 달러 기호 앞에 괄호로 묶으라는 뜻이라고 생각합니다. 둘 중 하나는 "텍스트"가 있는 파일의 줄 수를 할당합니다(대소문자를 구분하지 않음).

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

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

$check이제 일치하는 항목이 없으면 0이 되고, 일치하는 항목이 있으면 양수가 됩니다.

답변3

귀하의 질문은 명확하지 않지만 제출한 코드에 따르면 변수가 명령의 종료 상태를 check저장하려는 것 같습니다. grep이를 수행하는 방법은 실행하는 것입니다.

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

쉘에서 명령을 실행할 때 특수 쉘 매개변수를 통해 명령의 종료 상태를 얻을 수 있습니다 $?.

POSIX(Unix 계열 운영 체제의 표준)는 이를 문서에 기록합니다.쉘 사양Bash 구현은 다음 문서에 문서화되어 있습니다.특수 매개변수.

당신은 새로운 학습자이기 때문에 기초를 배우기 위해 좋은 책이나 온라인 튜토리얼로 시작하는 것이 좋습니다. Stack Exchange 웹사이트에서는 외부 리소스 추천을 권장하지 않지만,Lhunath와 GreyCat의 Bash 가이드.

답변4

다른 답변은 명령이 작동하지 않는 이유와 결과를 테스트하는 방법에 대한 좋은 제안을 밝힙니다. 한 가지 점을 더 추가하고 싶습니다.

$(명령)$? 종료 코드 추가

명령 대체와 종료 코드 검사를 모두 한 줄로 조합하여 이 작업을 수행할 수 있습니다. 종료 코드를 출력에 숫자로 추가합니다.

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

이는 실제로 $(some command)(명령의 문자열 출력 가져오기) 다음에 $?(마지막 명령의 종료 코드 가져오기)가 이어집니다. 작업을 하려면 공간 없이 함께 사용해야 합니다.

원천:https://www.assertnotmagic.com/2018/06/20/bash-brackets-quick-reference/#-dollar-single-parentheses-dollar-q-

출력 가능성이 있는 경우(대부분의 명령의 경우) 이를 억제하는 방법을 사용해야 합니다 > /dev/null 2>&1.

와 같은 테스트 명령을 사용하는 경우에는 이 작업이 필요하지 않을 수 있습니다 test -d <directory>.

check=$( grep -ci 'text' file.sh > /dev/null 2>&1)$?

함수를 사용하여 추상화할 수 있습니다.

e() {
    $@ > /dev/null 2>&1
}

# Usage:
check=$(e grep -ci 'text' file.sh)$?

테스트 종료 코드

나중에 사용하려면 0에 대해 테스트하세요(성공적으로).

[ $check -eq 0 ] && echo "passed" || echo "didn't pass"

[ $check -ne 0 ] && echo "didn't pass" || echo "passed"

if/then/else 구문을 사용하여 0에 대해 테스트(성공):

if [ $check -eq 0 ]; then
    echo "passed"
else
    echo "didn't pass"
fi

if [ $check -ne 0 ]; then
    echo "didn't pass"
else
    echo "passed"
fi

종료 코드를 직접 테스트

서브셸에서 사용하면 exit직접 사용할 수 있는 숫자를 기반으로 올바른 종료 코드가 생성됩니다.()

(exit $check) && echo "check passed" || echo "check didn't pass"

! (exit $check) && echo "check didn't pass" || echo "check passed"

if/then/else 구조를 사용하고 종료 코드를 직접 사용하십시오.

if (exit $check); then
    echo "passed"
else
    echo "didn't pass"
fi

if ! (exit $check); then
    echo "didn't pass"
else
    echo "passed"
fi

return대신 사용하면 exitzsh(bash는 아님)를 포함한 일부 셸에서도 작동합니다.

멋져지다

더 단순화하려면 다음 기능을 사용하십시오.

t() { return $1; }

이제 다음과 같이 테스트할 수 있습니다.

t $check && echo "passed" || echo "didn't pass"

! t $check && echo "didn't pass" || echo "passed"

관련 정보