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다음에 따라 다른 작업을 수행합니다.그들은 얼마나 많은 인수를 얻습니까?, 이는 연산자 주위에 공백을 두는 것이 중요하다는 것을 의미합니다.

관련 정보