Bashでelifステートメントの変数割り当てが壊れています。

Bashでelifステートメントの変数割り当てが壊れています。
#!/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を出力しているようです。問題の原因が何であるかを知っている人はいますか?

ベストアンサー1

Bashでは((...))算術式にのみ使用されます。OSandという単語はalpine変数名として扱われ、この変数には数値が含まれていないため、値は0です。0==0本当です、だからzypper。

あなたが望むのは、[[...]]文字列比較のための組み込み構文です。

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

[[(and[と)は、test次のように他の操作を実行します。彼らはどのくらいの買収を得るのでしょうか?、これは演算子の周りにスペースを入れることが重要であることを意味します。

おすすめ記事