[](대괄호)의 [: 너무 많은 인수] 오류의 의미
다음의 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(기본값)을 다른 기본값으로 변경해야 합니다.
마지막 메모:부터[
가기입니다.test
test: 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
유의해야 할 점이 몇 가지 있습니다.
- 「」 대신에 「」를 사용한다.
- & & 대신 -a를 사용하다
- [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
'programing' 카테고리의 다른 글
스크립트 자체 내에서 Bash 스크립트가 있는 디렉토리를 가져오려면 어떻게 해야 합니까? (0) | 2023.04.28 |
---|---|
어레이의 퍼포먼스와리스트 (0) | 2023.04.23 |
HTML을 일반 텍스트로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.23 |
키보드가 있을 때 편집 시작 시 UITextField를 위로 이동하려면 어떻게 해야 합니까? (0) | 2023.04.23 |
목록 내의 여러 data.frames를 동시에 Marge합니다. (0) | 2023.04.23 |