Unix read -p 명령으로 인해 bash 오류가 발생하는데 어떻게 해결합니까?

Unix read -p 명령으로 인해 bash 오류가 발생하는데 어떻게 해결합니까?

사용자에게 댓글을 남기도록 요청하려고 합니다.

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" ]

이 특별한 경우에는 $COMMENTnull이 아닌지 테스트합니다. 괄호 안에 쉘 단어가 두 개만 있기 때문에 이것은 바로 가기입니다. 일반적으로 문자열이 비어 있지 않은지 테스트하는 방법은 문자열이 비어 있는지 테스트하는 -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의 위키...

관련 정보