if와 함께 [ ] 연산자를 사용하지 않는 경우와 시기는 언제입니까?

if와 함께 [ ] 연산자를 사용하지 않는 경우와 시기는 언제입니까?
#!/bin/bash
echo 'Want Task 1'
read r1 ;
if [ echo "${r1}" | grep -iq "^y" ] ; then
    echo 'Task One Done'

    echo 'Want Task 2 ??'
    read r101
    if [ echo "${r101}" | grep -iq "^y" ] ; then 
        echo 'Task 2 Done'
    fi
fi

위의 코드를 실행하면 오류가 발생합니다.

[: `]' grep: ]: 해당 파일이나 디렉토리가 없습니다.

[그러나 단순히 대괄호를 생략 하면 ]코드가 완벽하게 실행됩니다. 테스트 명령인 것은 알지만 []언제 사용해야 할지, 언제 사용하지 말아야 할지 모르겠습니다.

[]또한 "연산자" 또는 test"명령" 이라고 불러야 하는지 명확히 해주세요.

참고로 필요한 경우 GNOME 터미널에서 Bash를 사용합니다.

답변1

파이프를 사용하면 명령이 다른 하위 셸에서 실행될 수 있으므로 명령( [grep)이 모두 불완전하므로(각각 예상대로 작동하지 않음) 오류 메시지가 표시됩니다.

프로그램의 결과 코드만 테스트하려는 경우 [ … ]또는 을 사용할 필요가 없으며 이러한 코드를 사용하여 또는 test와 같이 보다 명시적인 비교를 수행하기만 하면 됩니다 . 예를 들어 정규식을 사용하여 고급 비교를 원할 경우 명령을 사용할 수 있습니다 .[ 1 -gt 2 ][ "$1" == "$2" ][[ … ]]테스트 구조 그리고정규식 소개"고급 Bash 스크립팅 가이드"에서

답변2

동일한 작업을 수행하는 스크립트에 대한 또 다른 제안은 다음과 같습니다.

#! /bin/bash
read -p 'Want Task 1 ' 
if [ "${REPLY^}" = Y ] ; then
    echo 'Task One Done'

    read -p 'Want Task 2 ?? '
    if [ "${REPLY,}" = y ] ; then 
        echo 'Task 2 Done'
    fi
fi

기본 변수 read는 입니다 $REPLY. 사용하면 ${REPLY^}대문자 내용이 얻어지고, 사용하면 ${REPLY,}소문자 내용이 얻어집니다. 변수는 null일 수 있으므로 "인용해야 합니다.

실제로 이와 같은 외부 프로그램을 호출하려면 grep다음을 수행하십시오.

read -p 'Want Task 1 ' 
if echo $REPLY | grep -icq ^y ; then
        echo 'Task 1 Done'
fi

위에서 실제로 일어나는 일은 명령을 실행하고 종료 값이 0이 아닌 경우 true라는 것입니다. 이 예에서는 이를 보여줍니다.

if /bin/true ; then
    echo We have always the yes hat on
fi

그리고 그것은 [단지 이라는 프로그램일 뿐입니다 /usr/bin/test. 아래에서 알아보세요 man test.

관련 정보