|| 쉘 스크립트에서는 왜 작동하지 않나요?

|| 쉘 스크립트에서는 왜 작동하지 않나요?
# Detect Operating System
function dist-check() {
  # shellcheck disable=SC1090
  if [ -e /etc/os-release ]; then
    # shellcheck disable=SC1091
    source /etc/os-release
    DISTRO=$ID
    # shellcheck disable=SC2034
    DISTRO_VERSION=$VERSION_ID
  fi
}

# Check Operating System
dist-check

# Pre-Checks
function installing-system-requirements() {
  # shellcheck disable=SC2233,SC2050
  if ([ "$DISTRO" == "ubuntu" ] || [ "$DISTRO" == "debian" ] || [ "DISTRO" == "raspbian" ]); then
    apt-get update && apt-get install iptables curl coreutils bc jq sed e2fsprogs -y
  fi
  # shellcheck disable=SC2233,SC2050
  if ([ "$DISTRO" == "fedora" ] || [ "$DISTRO" == "centos" ] || [ "DISTRO" == "rhel" ]); then
    yum update -y && yum install epel-release iptables curl coreutils bc jq sed e2fsprogs -y
  fi
  if [ "$DISTRO" == "arch" ]; then
    pacman -Syu --noconfirm iptables curl bc jq sed
  fi
}

# Run the function and check for requirements
installing-system-requirements

왜 이것이 작동하지 않습니까?

배포판을 분리 했지만 ||여전히 작동하지 않습니다.

답변1

기타 참고사항:

function installing-system-requirements()함수 정의를 위한 표준 구문이 아닙니다. Bourne/POSIX 구문 은 Korn 구문 installing-system-requirements() compound-command입니다 . function installing-system-requirements { ...; }이와 같은 두 가지를 결합하는 것은 (주로 우연히) pdksh, zsh 및 bash에서 작동합니다(busybox sh 및 yash와 같은 일부 쉘은 bash와 호환되도록 지원을 추가했지만).

(...)이는 대부분의 쉘에서 서브쉘 프로세스를 포크하여 달성됩니다. 코드의 변경 사항이 지속되지 않도록 코드 조각을 격리하는 데에만 사용할 수 있습니다. 여기처럼 사용해도 별 의미가 없습니다.

유틸리티 [의 동일성 비교는 =가 아닙니다 ==(일부 [구현 ==과 확장에서는 이를 이해하지만).

여기에는 많은 독립적인 진술이 있습니다 if. 이는 $DISTRO이미 일치하는 항목이 있는 경우에도 debian이를 과 비교하려고 시도한다는 의미입니다. 이를 방지하려면 후속 검사에 다음 명령을 fedora사용할 수 있습니다 .elif

if [ "$DISTRO" = debian ] || [ "$DISTRO" = ubuntu ]; then
  ...
elif [ "$DISTRO" = fedora ] || [ "$DISTRO" = centos ]; then
  ...
fi

그러나 문자열을 여러 값이나 패턴과 일치시키려면 case구문을 사용하면 훨씬 쉬워집니다.

case "$DISTRO" in
  (ubuntu | debian) ...;;
  (ferdora | centos) ...;;
esac

답변2

# Detect Operating System
function dist-check() {
  # shellcheck disable=SC1090
  if [ -e /etc/os-release ]; then
    # shellcheck disable=SC1091
    source /etc/os-release
    DISTRO=$ID
    # shellcheck disable=SC2034
    DISTRO_VERSION=$VERSION_ID
  fi
}

# Check Operating System
dist-check

# Pre-Checks
function installing-system-requirements() {
  # shellcheck disable=SC2233,SC2050
  if ([ "$DISTRO" == "ubuntu" ] || [ "$DISTRO" == "debian" ] || [ "$DISTRO" == "raspbian" ]); then
    apt-get update && apt-get install iptables curl coreutils bc jq sed e2fsprogs -y
  fi
  # shellcheck disable=SC2233,SC2050
  if ([ "$DISTRO" == "fedora" ] || [ "$DISTRO" == "centos" ] || [ "$DISTRO" == "rhel" ]); then
    yum update -y && yum install epel-release iptables curl coreutils bc jq sed e2fsprogs -y
  fi
  if [ "$DISTRO" == "arch" ]; then
    pacman -Syu --noconfirm iptables curl bc jq sed
  fi
}

# Run the function and check for requirements
installing-system-requirements

누락$DISTRO

관련 정보