packages a serem instalados em um loop for se não estiver instalado [closed]

0

Poderia alguém ajudar a descobrir qual é o problema com o meu script de loop. Estou tentando instalar pacotes de uma lista de variáveis usando um loop for. Meus problemas é quando você pega o primeiro pacote para ser instalado e pega o pacote da lista ao mesmo tempo. Também instalará os pacotes todos ao mesmo tempo. Como faço para verificar isso? Eu preciso fazer um de cada vez.

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

Resultado do meu script:

+ 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
    
por pirulo 16.09.2016 / 16:11

1 resposta

5

Você usa sua variável de matriz ( $REQPKGS ) dentro de seu loop em vez da variável de loop ( $pkg ), então está fazendo exatamente o que você pediu, instale os dois pacotes ao mesmo tempo duas vezes.

Altere o interior do seu loop for para:

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

Ao usar um loop for , a variável definida após for contém o valor de cada iteração do loop; no seu caso, a variável que contém um único pacote de cada vez é $pkg .

Alternativamente

REQPKGS=(redhat-lsb-core telnet)

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

Instalará os pacotes especificados que não estiverem instalados e ignorará os pacotes já instalados.

    
por 16.09.2016 / 16:20