조건에 따라 Bash에서 "단항 연산자 예상"오류


225

나는 이것의 문제점을 알아 내려고 노력했지만 그것을 이해할 수는 없다.

이 부분은 오류가 발생하는 것 같습니다.

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

이 오류가 발생합니다.

calc_1.2: line 75: [: =: unary operator expected

4
if75 행 의 진술서에는 fi.
Steve

7
의심스러운 경우 vars를 인용하십시오.
koola

9
@ koola, '항상'견적 vars.
CousinCocaine

답변:


480

항상 bash를 사용한다는 것을 알고 있다면 [[ ... ]]Posix 호환 단일 브래킷 버전 대신 항상 이중 괄호 조건부 복합 명령을 사용하는 것이 훨씬 쉽습니다 [ ... ]. , 안쪽 [[ ... ]]당신이 의지 할 수 있도록 화합물, 단어 분할 및 경로 확장은 단어에 적용되지 않습니다

if [[ $aug1 == "and" ]];

의 값 $aug1과 문자열 을 비교합니다 and.

을 사용하는 경우 [ ... ]항상 다음과 같이 변수를 큰 따옴표로 묶어야합니다.

if [ "$aug1" = "and" ];

변수 확장을 인용하지 않고 변수가 정의되지 않았거나 비어있는 경우 범죄 현장에서 사라지고

if [ = "and" ]; 

유효한 구문이 아닙니다. $aug1공백이나 셸 메타 문자 가 포함되어 있으면 다른 오류 메시지와 함께 실패 합니다.

현대 [[연산자에는 정규 표현식 일치를 포함하여 다른 멋진 기능이 많이 있습니다.


9
"현대"? [[ 항상 bash에 있었습니까? 그것은 20 년 동안 Korn 껍질에 있었고, bash보다 오래되었습니다. (나는 당신이 무엇을 의미하는지 압니다)
cdarke

31

이것을 찾는 데 시간이 걸렸지 만 간격 오류가 있으면 동일한 오류가 발생합니다.

[: =: unary operator expected

옳은:

if [ "$APP_ENV" = "staging" ]

vs

if ["$APP_ENV" = "staging" ]

항상 -x디버그 변수를 설정 하면 다음을 찾는 데 도움이됩니다.

set -x

누군가 빌드 스크립트에서이 버그를 나에게 물었다. 시간을 절약했습니다. 감사합니다!
Kyle

8

명령문 $aug1에서 사용 하기 전에 값을 지정하십시오 if[]. 나중에 오류 메시지가 사라집니다.


0

너는 ... :

elif [$ operation = "man"]; 그런 다음 [$ aug1 = "add"]이면; then # <-Line 75 echo "Man Page for : add"echo ""echo "구문 : add [number 1] [number 2]"echo ""echo "Description :"echo "두 개의 다른 숫자를 더합니다." echo ""echo "Info :"echo "v1.0에 추가됨"echo ""elif [-z $ aug1]; echo "man 페이지를 읽을 명령을 지정하십시오." else echo "해당 명령에 대한 매뉴얼 페이지가 없습니다." fi

나는 그 공간을 생각합니다 ... 이렇게하십시오 :

elif [$operation = "man"]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [-z $aug1]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

-11

변수의 기본값을 설정할 수도 있으므로 두 개의 "["를 사용할 필요가 없습니다. 두 개의 "["는 하나 대신 두 개의 프로세스 ( "["는 실제로 프로그램 임)입니다.

$ {VARIABLE : -default} 구문을 사용합니다.

이 "기본"값이 "유효한"값 / 내용과는 다른 방식으로 모든 것을 생각해야합니다.

어떤 이유로 든 불가능한 경우 "if [-z $ VARIABLE]; [! -z $ VARIABLE]; #everything이면 나머지 스크립트로 진행하십시오. "


3
[[두 프로세스를 생성하지 않고 쉘 내장 ( [Bash 내장)입니다. [[[ [두 번째 [문자열을 문자열로 취급
하는와 다릅니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.