||シェルスクリプトではなぜ機能しないのですか?

||シェルスクリプトではなぜ機能しないのですか?
# 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 { ...; }これらの2つの組み合わせは(主に偶然に)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

おすすめ記事