为什么不会||在 shell 脚本中工作?

为什么不会||在 shell 脚本中工作?
# 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 语法是installing-system-requirements() compound-commandfunction installing-system-requirements { ...; }是 Korn 语法。像这样将两者结合起来就可以在 pdksh、zsh 和 bash 中工作(大部分是偶然的)(尽管一些 shell,如 busybox sh 和 yash 已经添加了对此的支持,以便与 bash 兼容)。

(...)就是引入一个子shell环境,在大多数shell中是通过fork一个子shell进程来实现的。您只能使用它来隔离一段代码,以便其中的更改不会持久。像在这里那样使用它们没有多大意义。

[实用程序的相等比较是=, 不是==(尽管某些[实现==以及扩展都可以理解)。

在这里,你有许多独立的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

相关内容