#!/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
.