if를 "and"와 함께 사용하려는 두 번의 시도가 실패했습니다. if [ ... ] -a [ ... ] , if [[ ... && ... ]] 이유는 무엇입니까?

if를 "and"와 함께 사용하려는 두 번의 시도가 실패했습니다. if [ ... ] -a [ ... ] , if [[ ... && ... ]] 이유는 무엇입니까?

Bash 스크립트에서 매개변수에 부울 값("true" 또는 "false")이 있는지 확인하고 싶습니다.
나는 이것을 두 가지 스크립트, 두 가지 다른 방법으로 시도하고 있는데 둘 다 실패합니다.
나는 많은 Stack Exchange 프롬프트를 확인했고 그것이 내가 해야 할 일을 한다고 생각하지만 그렇지 않습니다.

if [ "$2" != "true" ] -a [ "$2" != "false" ]; then
  echo "Indiquez si Geoserver est en installation initiale (false) ou update (true)" >&2;
  exit 1;
fi

메시지와 함께 실패Geoserver.sh: 12: [: true: unexpected operator

if [[ "$3" != "true" && "$3" != "false" ]]; then
  echo "Indiquez si Kafka est en installation initiale (false) ou update (true)" >&2;
  exit 1;
fi

실패한Kafka.sh: 18: [[: not found

답변1

표준 접근 방식은

[ "$3" != "true" ] && [ "$3" != "false" ]

즉, 두 개의 [명령이 실행되고, 각 명령은 테스트를 수행하며 &&쉘의 연산자와 연결됩니다.

[[...]]기능이 풍부한 많은 쉘에서 지원되는 ksh의 특수 비표준 쉘 구문이며 일반적으로 &&괄호를 지원합니다. 으로 구축되지 않는 bashbash사용할 수 있어야 --disable-cond-command하지만 오류 메시지의 문구에 따르면 쉘을 사용하는 것이 좋습니다 dash. bash를 사용하여 빌드할 때 오류 --disable-cond-commandGeoserver.sh: 12: [: too many arguments및 입니다 Kafka.sh: 18: [[: command not found.

-a[이전 버전과의 호환성을 위해 로 지원되지만 [ "$2" != "true" -a "$2" != "false" ]더 이상 사용되지 않으며 설계상 손상되었습니다( -o상대 부분과 마찬가지로).또는)을 사용하면 안 됩니다.

이는 복잡합니다.

답변2

bash두 오류 모두 전혀 사용하지 않고 대신 성능이 떨어지는 쉘을 사용하고 있음을 나타냅니다 dash.

또한 첫 번째 예에서는 "and" 절을 잘못 구현했습니다.

나는 이것이 당신이 원하는 것이고 정말로 사용하고 싶다면 작동해야 한다고 생각합니다 bash.

if [ "$2" != "true" -a "$2" != "false" ]; then

선호되는 방법은 다음과 같은 이식성이 더 높은 옵션인 경향이 있습니다.

if [ "$2" != "true" ] && [ "$2" != "false" ]; then

두 번째 예의 오류는 [[ ]]해당 표기법을 지원하는 셸을 사용하고 있지 않음을 나타냅니다. [ ] && [ ]위 스타일 표기법으로 변경하면 더 많은 성공을 거둘 수 있습니다.

관련 정보