![Unix read -p 명령으로 인해 bash 오류가 발생하는데 어떻게 해결합니까?](https://linux55.com/image/17806/Unix%20read%20-p%20%EB%AA%85%EB%A0%B9%EC%9C%BC%EB%A1%9C%20%EC%9D%B8%ED%95%B4%20bash%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94%EB%8D%B0%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%B4%EA%B2%B0%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
사용자에게 댓글을 남기도록 요청하려고 합니다.
function comment {
if [ ! $1 ]
then
read -p "enter checkin comment < " COMMENT;
else
export COMMENT="$1"
fi
if [ ! $COMMENT ]
then
echo 'no comment!'
else
echo "$COMMENT";
fi
}
고쳐 쓰다 프롬프트에 여러 단어를 입력하면 이런 일이 발생합니다. 예를 들어 "update"를 입력하면 오류 메시지가 표시되지 않지만...여러 단어를 입력하면
enter checkin comment >> sun mars venus
그러면 오류가 발생합니다(항상 두 번째 단어에서).
-bash: [: mars: binary operator expected
답변1
if [ ! $COMMENT ]
비어 있지 않은지 확인하려는 것 같지만 $COMMENT
이 명령이 수행하는 작업은 아닙니다. 따옴표가 없는 변수 대체는 파일 이름 생성(와일드카드) 및 토큰화를 거칩니다. 여기서 sun mars venus
주석( )에 몇 단어를 입력하면 [
명령이 ! sun mars venus
유효한 구문이 아닌 (4개 매개변수)를 볼 수 있습니다. 변수 대체는 항상 큰따옴표로 묶습니다.
if [ ! "$COMMENT" ]
이 특별한 경우에는 $COMMENT
null이 아닌지 테스트합니다. 괄호 안에 쉘 단어가 두 개만 있기 때문에 이것은 바로 가기입니다. 일반적으로 문자열이 비어 있지 않은지 테스트하는 방법은 문자열이 비어 있는지 테스트하는 -n
연산자를 사용하는 것입니다.-z
if [ -z "$COMMENT" ]
[[ … ]]
ksh/bash/zsh에서는 명령 대신 구성을 사용할 수 있습니다 [ … ]
. 단일 괄호는 일반적인 쉘 구문 규칙이 적용되는 일반 명령인 반면, 이중 괄호는 자체 규칙이 있는 특수 쉘 구문입니다. 이중 괄호 안에는 분사가 없으므로 다음과 같이 쓸 수 있습니다.
if [[ -z $COMMENT ]]
큰따옴표는 문제가 되지 않습니다.
또는 if [ ! $1 ]
이어야 하는 경우 에도 동일하게 적용됩니다 .if [ -z "$1" ]
if [[ -z $1 ]]
또 다른 이상한 점은 COMMENT
주석이 함수에 인수로 전달되면 변수를 환경으로 내보내지만 read
내장 함수를 사용하여 읽을 때는 그렇지 않다는 것입니다. 외부 프로그램에 전달해야 하는 경우가 아니면 COMMENT
단어를 제거하십시오 export
.
답변2
[
Bash는 이를 명령 으로 해석합니다 test
(인수 주위에 공백이 필요합니다). 바라보다테스트 및 조건에 관한 Greg의 위키...