Me ajudem com vetor em shell? [RESOLVIDO]

1. Me ajudem com vetor em shell? [RESOLVIDO]

Ghoost User
ghoostuser

(usa Arch Linux)

Enviado em 25/11/2015 - 20:15h

Galera, tenho esse script abaixo:



#!/bin/bash

DISTRO=$(cat /etc/*-release | grep ^NAME | cut -d'=' -f2 | cut -d'"' -f2)

VET_DISTRO=("CentOS Linux" "Arch Linux" "Fedora" "Debian GNU/Linux")

for i in ${VET_DISTRO[*]}
do
if [[ "$i" == "$DISTRO" ]];then
echo "Distribuição suportada!"
fi
done



...o que eu quero é fazer uma comparação com as strings do vetor que são nome das distribuições, com o nome da distro atual retirado
da variavel DISTRO.

Só que esse script num da retornando certo a mensagem "Distribuição suportada".

Alguem pode me ajudar?
Grato :)


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/11/2015 - 01:27h

gabrielscorpion escreveu:

Galera, tenho esse script abaixo:

#!/bin/bash

DISTRO=$(cat /etc/*-release | grep ^NAME | cut -d'=' -f2 | cut -d'"' -f2)

VET_DISTRO=("CentOS Linux" "Arch Linux" "Fedora" "Debian GNU/Linux")

for i in ${VET_DISTRO[*]}
do
if [[ "$i" == "$DISTRO" ]];then
echo "Distribuição suportada!"
fi
done


...o que eu quero é fazer uma comparação com as strings do vetor que são nome das distribuições, com o nome da distro atual retirado
da variavel DISTRO.

Só que esse script num da retornando certo a mensagem "Distribuição suportada".


A primeira coisa é saber se as strings que você está procurando são essas mesmas.

Mas há problemas, sim, no seu script. A expansão de VET_DISTRO está sendo feita de uma forma que permite ao shell entender espaços dentro de cada elemento do vetor como palavras distintas passadas como argumentos para o for. Em vez de usar somente ${VET_DISTRO[*]}, você deveria usar "${VET_DISTRO[@]}" (aspas incluídas, e note a troca de “*” por “@”).

Mas será que isso é mesmo necessário? Você poderia simplificar esse seu script com apenas uma chamada a egrep, parecida com o que vai abaixo.

if egrep -q '^NAME=("?)(CentOS Linux|Arch Linux|Fedora|Debian GNU/Linux)\1[[:space:]]*$' /etc/*-release; then
echo "Distribuição suportada"
fi


3. res:Me ajudem com vetor em shell?

marcio mendes mendes
conectadohost

(usa XUbuntu)

Enviado em 25/11/2015 - 20:34h

Olá,
Trabalho com CentOS, vou instalar seu script para ver o que está ocorrendo para tentar lhe ajudar.

---> A arte de programar consiste na arte de organizar e dominar a complexidade.
---> Dijkstra <---


4. Re: Me ajudem com vetor em shell? [RESOLVIDO]

Ghoost User
ghoostuser

(usa Arch Linux)

Enviado em 25/11/2015 - 20:44h

conectadohost escreveu:

Olá,
Trabalho com CentOS, vou instalar seu script para ver o que está ocorrendo para tentar lhe ajudar.

---> A arte de programar consiste na arte de organizar e dominar a complexidade.
---> Dijkstra <---


Ta, obrigado é uma questao logica q não estou conseguindo





5. res:Me ajudem com vetor em shell?

marcio mendes mendes
conectadohost

(usa XUbuntu)

Enviado em 25/11/2015 - 21:09h

Olá,
testei no meu CentOS eu acrescentei o else e o echo para verificar se não estava concluindo todo o script
echo "Distribuição suportada!"
else
echo " Não encontramos sua distribuição "
fi
done

ele faz a leitura normal com o cat /etc/*-release

acredito eu que como o nome da distribuição tenha espaço tipo o meu CentOS release 6.7 (Final)

o script do modo que foi programado está fazendo a leitura somente do inicio como esta na variável
VET_DISTRO=("CentOS Linux" "Arch Linux" "Fedora" "Debian GNU/Linux")

ou seja ele lê somente CentOS e acusa como não encontrado

acho que esse script teria que mudar a forma de testar as variaveis

salvei 2 prints de como ele rodou aqui
http://prntscr.com/96z6wr
http://prntscr.com/96z75b

Tambem fiz da seguinte forma coloquei o nome correto da minha distribuição dentro da variavel
VET_DISTRO=("CentOS release 6.7 (Final)")

ele exibiu 4 mensagens
Não encontramos sua distribuição
Não encontramos sua distribuição
Não encontramos sua distribuição
Não encontramos sua distribuição

ai você vai me perguntar mas por que ele exibiu 4 mensagens sendo que você colocou somente um nome da distribuição

por que o script entende que quando você coloca o nome com espaço dessa forma CentOS release 6.7 (Final)

ele entende que são 4 nomes para pesquisar.


gabrielscorpion escreveu:

Galera, tenho esse script abaixo:



#!/bin/bash

DISTRO=$(cat /etc/*-release | grep ^NAME | cut -d'=' -f2 | cut -d'"' -f2)

VET_DISTRO=("CentOS Linux" "Arch Linux" "Fedora" "Debian GNU/Linux")

for i in ${VET_DISTRO[*]}
do
if [[ "$i" == "$DISTRO" ]];then
echo "Distribuição suportada!"
fi
done



...o que eu quero é fazer uma comparação com as strings do vetor que são nome das distribuições, com o nome da distro atual retirado
da variavel DISTRO.

Só que esse script num da retornando certo a mensagem "Distribuição suportada".

Alguem pode me ajudar?
Grato :)




---> A arte de programar consiste na arte de organizar e dominar a complexidade.
---> Dijkstra <---


6. res:Me ajudem com vetor em shell?

marcio mendes mendes
conectadohost

(usa XUbuntu)

Enviado em 25/11/2015 - 21:42h

Olá,
Fiz da forma que estou acostumado a fazer
sempre crio um arquivo e faço a leitura desse arquivo

criei um arquivo no home com nome de distri.txt

e dentro dele coloquei os nomes das distribuições que você utilizou no script
e criei uma variavel DB antes delas desse modo


DB CentOS Linux
DB Arch Linux
DB Fedora
DB Debian GNU/Linux


e usei o awk -F " " '{print $1}' para ler somente o primeiro nome da distribuição

funcionou legal no meu CentOS, você pode modificar ele

tirei um print http://prntscr.com/96zl1z

ele exibiu 3 vezes a mensagem
Distribuição CentOS suportada!
Distribuição CentOS suportada!
Distribuição CentOS suportada!

por que quando se executa o comando cat /etc/*-release
ele exibe 3 resultados
CentOS release 6.7 (Final)
CentOS release 6.7 (Final)
CentOS release 6.7 (Final)


Espero ter lhe ajudo.

segue o script

#!/bin/bash
SHELL=/bin/sh
PATH=/sbin:/usr/sbin:/usr/bin:/bin

let linhas=`cat /etc/*-release | awk -F " " '{print $1}' |wc -l`
cat /etc/*-release | awk -F " " '{print $1}'|tail -$linhas|sed 's/DB//'|sed 's/G//g'|
while read DB
do


VERIFICA=` cat /home/distri.txt | grep $DB | wc -l `

if [ "$VERIFICA" -gt "0" ]
then
echo " Distribuição $DB suportada!"
else
echo -e " Não encontramos sua distribuição "
fi
done



gabrielscorpion escreveu:

Galera, tenho esse script abaixo:



#!/bin/bash

DISTRO=$(cat /etc/*-release | grep ^NAME | cut -d'=' -f2 | cut -d'"' -f2)

VET_DISTRO=("CentOS Linux" "Arch Linux" "Fedora" "Debian GNU/Linux")

for i in ${VET_DISTRO[*]}
do
if [[ "$i" == "$DISTRO" ]];then
echo "Distribuição suportada!"
fi
done



...o que eu quero é fazer uma comparação com as strings do vetor que são nome das distribuições, com o nome da distro atual retirado
da variavel DISTRO.

Só que esse script num da retornando certo a mensagem "Distribuição suportada".

Alguem pode me ajudar?
Grato :)




---> A arte de programar consiste na arte de organizar e dominar a complexidade.
---> Dijkstra <---


7. Re: Me ajudem com vetor em shell?

Ghoost User
ghoostuser

(usa Arch Linux)

Enviado em 25/11/2015 - 21:43h

conectadohost escreveu:

Olá,
testei no meu CentOS eu acrescentei o else e o echo para verificar se não estava concluindo todo o script
echo "Distribuição suportada!"
else
echo " Não encontramos sua distribuição "
fi
done

ele faz a leitura normal com o cat /etc/*-release

acredito eu que como o nome da distribuição tenha espaço tipo o meu CentOS release 6.7 (Final)

o script do modo que foi programado está fazendo a leitura somente do inicio como esta na variável
VET_DISTRO=("CentOS Linux" "Arch Linux" "Fedora" "Debian GNU/Linux")

ou seja ele lê somente CentOS e acusa como não encontrado

acho que esse script teria que mudar a forma de testar as variaveis

salvei 2 prints de como ele rodou aqui
http://prntscr.com/96z6wr
http://prntscr.com/96z75b

Tambem fiz da seguinte forma coloquei o nome correto da minha distribuição dentro da variavel
VET_DISTRO=("CentOS release 6.7 (Final)")

ele exibiu 4 mensagens
Não encontramos sua distribuição
Não encontramos sua distribuição
Não encontramos sua distribuição
Não encontramos sua distribuição

ai você vai me perguntar mas por que ele exibiu 4 mensagens sendo que você colocou somente um nome da distribuição

por que o script entende que quando você coloca o nome com espaço dessa forma CentOS release 6.7 (Final)

ele entende que são 4 nomes para pesquisar.


gabrielscorpion escreveu:

Galera, tenho esse script abaixo:



#!/bin/bash

DISTRO=$(cat /etc/*-release | grep ^NAME | cut -d'=' -f2 | cut -d'"' -f2)

VET_DISTRO=("CentOS Linux" "Arch Linux" "Fedora" "Debian GNU/Linux")

for i in ${VET_DISTRO[*]}
do
if [[ "$i" == "$DISTRO" ]];then
echo "Distribuição suportada!"
fi
done



...o que eu quero é fazer uma comparação com as strings do vetor que são nome das distribuições, com o nome da distro atual retirado
da variavel DISTRO.

Só que esse script num da retornando certo a mensagem "Distribuição suportada".

Alguem pode me ajudar?
Grato :)




---> A arte de programar consiste na arte de organizar e dominar a complexidade.
---> Dijkstra <---


1)
Bom, acho que não tem nada a ver o espaço.
É uma comparação de strings, como se fosse igual esse de baixo, que da certo:


DISTRO="CentOS Linux"
if [[ "$DISTRO" == "CentOS Linux" ]]; then
echo "igual"
else
echo "não é igual"
fi


Porem ai em cima, a variavel DISTRO esta recebendo um valor fixo, ja com este comando:

DISTRO_NAME=$(cat /etc/*-release | grep ^NAME | cut -d'=' -f2 | cut -d'"' -f2)


Vai me retornar o nome da distro retirado da variavel NAME do arquivo "/etc/*-release". Porem o valor irá ser igual a esse mesmo, o dê "CentOS Linux". Bom, pelo menos no meu CentOS o comando da variavel DISTRO_NAME retorno isso.

2) Eu não sei por qual motivo o seu comando "cat /etc/*-release" retornou apenas uma unica linha
no seu CentOS. Quando testei no meu esse unico comando com o cat, sem os "cut" e "grep", me
retorna informações contendo o PRETTY, NAME, ID..etc. Tipo assim:


cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support/"
BUG_REPORT_URL="https://bugs.debian.org/"









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts