Bash는 다음을 제공합니다: 매개변수 오류가 너무 많습니다.

Bash는 다음을 제공합니다: 매개변수 오류가 너무 많습니다.

ACCESS_TOKENnull이 같은지 확인하고 종료되는 bash 스크립트가 있습니다 .

ACCESS_TOKEN=$(jq -r '.access_token' <<<"$(curl --request GET \
  --url 'https://'$LANDSCAPE'/oauth/token/?grant_type=client_credentials' \
  -u "$CLIENT_ID":"$CLIENT_SECRET")")
if [[ -n $ACCESS_TOKEN -eq null ]]; then 
   exit 1
fi

또는:

ACCESS_TOKEN=$(jq -r '.access_token' <<<"$(curl --request GET \
  --url 'https://'$LANDSCAPE'/oauth/token/?grant_type=client_credentials' \
  -u "$CLIENT_ID":"$CLIENT_SECRET")")
if [ -n "$ACCESS_TOKEN" -eq null ]; then 
   exit 1
fi

콘솔 로그:

+ ACCESS_TOKEN=null
+ '[' -n null -eq null ']'
/tmp/jenkins6798373284183556496.sh: line 8: [: too many arguments

if condition그다지 잘 작동하는 것 같지는 않습니다.

답변1

문자열이 비어 있지 않은지 확인하고 싶다면그리고"null"인 경우 더 나은 구문은 다음과 같습니다.

if [ -n "$ACCESS_TOKEN" ] && [ "$ACCESS_TOKEN" = "null" ] 
then 
   exit 1
fi

@Tomaz가 올바르게 지적했듯이 Bash 구문을 사용하면 두 전제를 동시에 확인할 수 없습니다.

@Kusanalanda도 지적했듯이 첫 번째 테스트는 관련이 없으며 단지 if사용법을 설명/설명하기 위한 것입니다. 논리적으로 $ACCESS_TOKEN을 다시 테스트하면"null"이면 이미 문자열이 비어 있을 수 없음을 의미하므로 실제로 다음과 같이 다시 작성할 수 있습니다.

if [ "$ACCESS_TOKEN" = "null" ] 
then 
   exit 1
fi

답변2

확인 해봐:

[ -n "$ACCESS_TOKEN" -eq null ]

[테스트 연산자인 경우 다음을 확인할 수 있습니다.

  • 문자열 값이 0이 아닌 경우 - 사용할 때-n

  • 두 정수 비교 - 사용할 때-eq

하지만 동시에 둘 다는 아닙니다! (적어도 이 형태는 아닙니다.) 따라서 이 형태에서 확인하고 싶은 내용을 선택해야 합니다 [. 비교하려는 경우 연산자를 통해 수행되는 null문자열 비교가 됩니다 =.

답변3

쉘을 사용할 수 있습니다

매개변수 확장. . . ${매개변수:-단어} 기본값을 사용합니다. 인수가 설정되지 않거나 비어 있으면 단어의 확장이 대체됩니다.

좋다

if [ "${ACCESS_TOKEN:-x}" = null ]; then echo Yes; else echo No; fi;

test리터럴 문자열에서는 변수의 null "속성"이 아니라 "null"입니다 .

관련 정보