Bash

在 Bash 中使用 elif 語句破壞變數賦值

  • December 10, 2021
#!/bin/bash
if [[ $(which yum) ]]; then
  OS="CentOS"
elif [[ $(which apt) ]]; then
  OS="Debian"
elif [[ $(which apk) ]]; then
  OS="Alpine"
elif [[ $(which zypper) ]]; then
  OS="OpenSuse"
elif [[ $(which pacman) ]]; then
  OS="Arch"
elif [[ $(which dnf) ]]; then
  OS="Fedora"
else
  IS_UNKNOWN=1
fi
echo "$IS_UNKNOWN"
suse="OpenSuse"
alpine2="Alpine"
cent="CentOS"
redhat="Fedora"
deb="Debian"
pacman="Arch"
if (( OS==suse ))
then 
   export package_manager="zypper install -y"
elif (( OS==alpine2 ))
then 
   export package_manager="apk --update add"
elif (( OS==cent ))
then 
   export package_manager="yum install -y"
elif (( OS==redhat ))
then 
   export package_manager="dnf install -y"
elif (( OS==pacman ))
then
   export package_manager="pacman -Sy"
elif (( OS==deb ))
then 
   export package_manager="apt install -y"
else
   printf "No package manager detected, aborting."
   exit 1
fi
echo "$package_manager"

試圖在 bash 中檢測 linux 使用者的包管理器,但即使我使用的包管理器不是 zypper 並且未安裝 zypper,它似乎總是輸出 zypper。有人知道可能導致問題的原因嗎?

在 bash 中,((...))嚴格用於算術表達式。單詞OSandalpine被視為變數名,並且由於這些變數不包含數字,因此它們的值為零。0==0是真的,所以 zypper。

您想要的是[[...]]用於字元串比較的內置構造。

if [[ "$OS" == "zypper" ]]

請注意,[[(以及[and test)根據獲得的參數數量來做不同的事情,這意味著在運算符周圍放置空格非常重要。

引用自:https://unix.stackexchange.com/questions/680991