programing

[](대괄호)의 [: 너무 많은 인수] 오류의 의미

topblog 2023. 4. 23. 09:58
반응형

[](대괄호)의 [: 너무 많은 인수] 오류의 의미

다음의 BASH 쉘 에러의 의미와 수정을 나타내는 간단한 자원을 찾을 수 없었기 때문에, 조사해 보고 투고하고 있습니다.

오류:

-bash: [: too many arguments

Google 화적 google : bash open square bracket colon too many arguments.

콘텍스트: 단일 대괄호 안의 if 조건과 등호, 등호, 등호 등의 단순 비교 연산자가 있는 경우.다음은 예를 제시하겠습니다.

VARIABLE=$(/some/command);
if [ $VARIABLE == 0 ]; then
  # some action
fi 

의 '' ''가$VARIABLE공백 또는 기타 특수문자를 포함하는 문자열로, 단일 대괄호가 사용됩니다(이것은 숏컷입니다).test명령어)를 사용하여 문자열을 여러 단어로 분할할 수 있습니다.이것들은 각각 별개의 인수로 취급됩니다.

따라서 하나의 변수를 여러 인수로 분할할 수 있습니다.

VARIABLE=$(/some/command);  
# returns "hello world"

if [ $VARIABLE == 0 ]; then
  # fails as if you wrote:
  # if [ hello world == 0 ]
fi 

공백 또는 기타 특수문자를 포함하는 문자열을 포함하는 함수 호출에 대해서도 마찬가지입니다.


간단한 수정

변수 출력을 큰따옴표로 묶어서 강제로 하나의 문자열로 유지합니다(따라서 하나의 인수).예를들면,

VARIABLE=$(/some/command);
if [ "$VARIABLE" == 0 ]; then
  # some action
fi 

그렇게 간단하다.하지만 "또한 주의..변수도 빈 문자열 또는 공백만 포함하는 문자열이 아님을 보증할 수 없는 경우.


또는 이중 대괄호(이것이 바로 가기)를 사용하는 방법도 있습니다.new test명령)을 실행합니다.

bashzsh)에만에 "bash"("korn "zsh")가 되지 않을 수 ./bin/sh★★★★★★★★★★★★★★★.

즉, 시스템에 따라서는 콘솔에서는 동작할 수 있지만, 모든 것이 어떻게 설정되어 있는지에 따라서는, 에서 등 다른 장소에서 호출했을 때는 동작하지 않는 경우가 있습니다.

다음과 같습니다.

VARIABLE=$(/some/command);
if [[ $VARIABLE == 0 ]]; then
  # some action
fi 

에 이와 합니다.[[ 또는 하고 있는 모든 이, 「이러한 셸」을 서포트하는 하고 있는 것을 .[[ a a a anew test.


★★★★★★★★★★★★★★★★도 주의해 주세요.[: unary operator expected 발생

"too many arguments" 오류가 표시되는 경우 예측 불가능한 출력을 가진 함수에서 문자열을 얻었을 수 있습니다.빈 문자열(또는 모든 공백 문자열)도 가져올 있는 경우 위의 "빠른 수정"을 사용하더라도 이 문자열은 0 인수로 처리되며 다음 명령에서 실패합니다.[: unary operator expected

다른 언어에 익숙하다면 같은 "gotcha"입니다. 변수의 내용이 평가되기 전에 코드에 효과적으로 인쇄될 것으로 기대하지는 않습니다.

두 를 모두 가 있습니다.[: too many arguments[: unary operator expected 있는 예에서는 에러 「」를 참조해 주세요).0큰따옴표로 둘러싸여 있습니다.

VARIABLE=$(/some/command);
if [ "${VARIABLE:-0}" == 0 ]; then
  # some action
fi 

(여기서 $VARILE이 0이거나 비어 있는 경우 액션이 발생합니다.당연히 다른 동작을 원하는 경우 0(기본값)을 다른 기본값으로 변경해야 합니다.


마지막 메모:부터[ 가기입니다.testtest: too many arguments (또한)test: unary operator expected)

같은 에러가 발생하여 두 변수가 모두 비어 있는지(또는 비어 있지 않은지) 테스트하려고 합니다.그것은 7.3의 복합 비교로 판명되었다. 기타 비교 연산자 - Advanced Bash-Scripting Guide (상세 배시 스크립트 작성 가이드)에서 다음 사항에 유의해야 합니다.

  • 처음에는 '비어 있다'는 뜻이라고 생각했지만, '파일이 존재한다'는 의미입니다.사용하세요.-z 변수(문자열) 테스트용
  • 문자열 변수는 따옴표로 묶어야 합니다.
  • 복합 논리 AND 비교의 경우 다음 중 하나를 수행합니다.
    • test §&&다음 중 하나를 선택합니다.[ ... ] && [ ... ]
    • '어느 정도'를 쓰거나요.-a "" " " " " " " 에서의 연산자""test[ ... -a ... ]

디렉토리 하여 해당 txt 파일을 ).grep의 2 개의 가 모두 포함되어 있습니다.

find /usr/share/doc -name '*.txt' | while read file; do \
  a1=$(grep -H "description" $file); \
  a2=$(grep -H "changes" $file); \
  [ ! -z "$a1" -a ! -z "$a2"  ] && echo -e "$a1 \n $a2" ; \
done

2013년 8월 12일 편집: 관련 문제 노트:

string equality classic classic을 with classic을 체크하는 것에 주의해 .test 각 (''))[), "is equal" 연산자 사이에 공백이 있어야 합니다.이 경우 단일 "equals" 연산자가 됩니다.=, 두 는 같다)==동등 연산자로도 받아들여지는 것 같다.)따라서, 이것은 (사일런트하게) 실패합니다.

$ if [ "1"=="" ] ; then echo A; else echo B; fi 
A
$ if [ "1"="" ] ; then echo A; else echo B; fi 
A
$ if [ "1"="" ] && [ "1"="1" ] ; then echo A; else echo B; fi 
A
$ if [ "1"=="" ] && [ "1"=="1" ] ; then echo A; else echo B; fi 
A

...스페이스를 추가해 주세요.모두 좋아보입니다.

$ if [ "1" = "" ] ; then echo A; else echo B; fi 
B
$ if [ "1" == "" ] ; then echo A; else echo B; fi 
B
$ if [ "1" = "" -a "1" = "1" ] ; then echo A; else echo B; fi 
B
$ if [ "1" == "" -a "1" == "1" ] ; then echo A; else echo B; fi 
B

다른 로는 '먹다'를 수 있습니다.[: too many arguments ★★★★★★★★★★★★★★★★★」[: a: binary operator expected에 대해 입니다."$@"

if [ -z "$@" ]
then
    echo "Argument required."
fi

동작합니다.foo.sh ★★★★★★★★★★★★★★★★★」foo.sh arg1 arg와 같은 여러 의 arg를 foo.sh arg1 arg2에러가 표시됩니다.입니다.[ -z arg1 arg2 ]유효한 구문이 아닙니다.

은 " " 입니다.[ "$#" -eq 0 ] ( . )$#수입입입 입다다다

나도 같은 문제에 직면했다.@sdaau의 대답이 논리적으로 도움이 되었다.여기서 내가 하고 있던 것은 구문적으로는 맞는 것 같지만 너무 많은 인수가 틀렸다.

잘못된 구문:

if [ $Name != '' ] && [ $age != '' ] && [ $sex != '' ] && [ $birthyear != '' ]  && [ $gender != '' ] 
then
    echo "$Name"
    echo "$age"
    echo "$sex"
    echo "$birthyear"
    echo "$gender"
else
    echo "Enter all the values"
fi

위의 if 스테이트먼트에서 아래에 언급된 변수 값을 전달하면 구문 오류도 발생합니다.

export "Name"="John"
export "age"="31"
export "birthyear"="1990"
export "gender"="M"

아래 구문을 사용하면 예상되는 출력을 얻을 수 있습니다.올바른 구문:

if [ "$Name" != ""  -a  "$age" != ""  -a  "$sex" != ""  -a  "$birthyear" != ""   -a  "$gender" != "" ] 
then
    echo "$Name"
    echo "$age"
    echo "$sex"
    echo "$birthyear"
    echo "$gender"
else
    echo "it failed"
fi

유의해야 할 점이 몇 가지 있습니다.

  1. 「」 대신에 「」를 사용한다.
  2. & & 대신 -a를 사용하다
  3. [a = b]와 같은 연산자 기호 앞뒤에 공백을 넣으십시오. if 조건에서는 [a=b]로 사용하지 마십시오.

그 때문에, 상기의 솔루션은 나에게 효과가 있었다!!!

가끔 키보드를 잘못 터치해서 공간이 없어지면.

if [ "$myvar" = "something"]; then
    do something
fi

이 오류 메시지를 트리거합니다.']' 앞에 공백이 필요합니다.

대본에도 같은 문제가 있었습니다.하지만 몇 가지 수정을 해보니 효과가 있었어요.저는 이렇게 했어요:-

export k=$(date "+%k");
if [ $k -ge 16 ] 
    then exit 0; 
else 
    echo "good job for nothing"; 
fi;

그렇게 해서 문제를 해결했어요그것이 당신에게도 도움이 되기를 바랍니다.

언급URL : https://stackoverflow.com/questions/13781216/meaning-of-too-many-arguments-error-from-if-square-brackets

반응형