インストールされていない場合は、forループにパッケージをインストールする[閉じる]

インストールされていない場合は、forループにパッケージをインストールする[閉じる]

私のforループスクリプトにどのような問題があるかを見つけるのに役立つ人はいますか? forループを使用して変数リストからパッケージをインストールしようとしています。私の問題は、リストからパッケージをインポートしている間にインストールする最初のパッケージをインポートするときです。また、すべてのパッケージを同時にインストールします。どうやって確認できますか?一度に一つずつしなければなりません。

REQPKGS="redhat-lsb-core telnet"

for pkg in $REQPKGS; do
    if yum -q list installed "$REQPKGS" > /dev/null 2>&1; then
        echo -e "$pkg is already installed"
    else
        yum install $REQPKGS -y
        echo "Successfully installed $REQPKGS"
    fi
done

私のスクリプトの結果:

+ REQPKGS='redhat-lsb-core telnet'
+ for pkg in '$REQPKGS'
+ yum -q list installed 'redhat-lsb-core telnet'
+ yum install redhat-lsb-core telnet -y
+ echo 'Successfully installed redhat-lsb-core telnet'
Successfully installed redhat-lsb-core telnet
+ for pkg in '$REQPKGS'
+ yum -q list installed 'redhat-lsb-core telnet'
+ yum install redhat-lsb-core telnet -y
Loaded plugins: product-id, refresh-packagekit, rhnplugin, security, subscription-manager
This system is receiving updates from RHN Classic or RHN Satellite.
Setting up Install Process
Package redhat-lsb-core-4.0-7.el6.x86_64 already installed and latest version
Package 1:telnet-0.17-48.el6.x86_64 already installed and latest version
Nothing to do
+ echo 'Successfully installed redhat-lsb-core telnet'
Successfully installed redhat-lsb-core telnet

ベストアンサー1

$REQPKGSループ変数()の代わりに配列変数()をループで使用するので、指示に従って$pkg正確に実行され、両方のパッケージを2回インストールします。

ループ内をfor次のように変更します。

REQPKGS=(redhat-lsb-core telnet)

for pkg in "${REQPKGS[@]}"; do
    if yum -q list installed "$pkg" > /dev/null 2>&1; then
        echo -e "$pkg is already installed"
    else
        yum install "$pkg" -y && echo "Successfully installed $pkg"
    fi
done

forループを使用するときは、forループ内の各反復の値を保持する変数(一度に単一のパッケージを含む変数)を定義します$pkg

または

REQPKGS=(redhat-lsb-core telnet)

yum install -y "${REQPKGS[@]}"

指定されたすべての削除されたパッケージがインストールされ、インストールされているすべてのパッケージはスキップされます。

おすすめ記事