Script shell : test incorrect et ouverture fichier

gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

Yop,

Je suis en train de faire un script en shell, mais j'ai un problème:

quand j’exécute mon script:
#!/bin/bash

#Listing des noms de vm
`ls /etc/xen/*.cfg | sed 's/.cfg//g' > /etc/xen/liste_vm.txt`

#Saisie du nom de la vm
echo 'Saisir nom vm :'
read name_vm

#Verifie l'existence du nom de la vm
while [ ! -f /etc/xen/$name_vm.cfg ]
do
echo 'La vm existe deja, re-saisir:'
read name_vm
done
echo 'Choix du nom termine.'

#Recuperation taille hdd libre
hdd_free = `df -h -B G | tr ' ' '\n' | grep G | tail -1 | tr -d 'G'`

#Saisie taille HDD
echo 'Saisir la taille du hdd (G):'
read hdd_size

#Controle de l'espace libre hdd
if [ $hdd_size -gt $hdd_free ]; then
while $hdd_size > $hdd_free
do echo 'Re-Saisir la taille du hdd:'
read hdd_size
done
else hdd_free_after_vm = $(( $hdd_free - $hdd_size ))
echo 'Il reste: ' $hdd_free_after_vm
fi

#Recupere la memoire libre
mem_size_free = `free -m | grep buffer | tr ' ' '\n' | tail -1`

#Saisie de la taille de la memoire vive
echo 'Saisir taille ram :'
read mem_size

#Verife de l'espace libre memoire
if $mem_size > $mem_size_free then
echo 'Re-Saisir la taille de la memoire:'
read mem_size
else mem_size_after_vm = $mem_size_free - $mem_size
echo 'Il reste: ' $mem_size_after_vm 'Mb'
fi

#Sairsir adresse ip
echo 'Saisir adresse ip :'
read ip_adress

#Saisir distribution
echo 'Saisir la distribution (squeeze - lenny) :'
read distrib_name
while [ $distrib_name != 'squeeze' || $distrib_name != 'lenny' ]; do
#if $distrib_name != 'squeeze' or $distrib_name != 'lenny'
echo 'Re-saisir la distrib (squeeze - lenny) :'
read distrib_name
#fi
done

#Creation vm
echo xen-create-image --hostname=$name_vm --size=$hdd_size'Gb' --fs=ext4 --memory=$mem_size'Mb' --noswap --dist=$distrib_name --arch=amd64 --ip=$ip_adress --netmask=255.255.255.0 --gateway=192.168.1.2 --passwd --role=udev

#Ajout de la vm au tableau
#xm create /etc/xen/$namevm'.cfg'
ca me donne ca:
Saisir nom vm :
test
./vm-create-1.2: line 19: = : commande introuvable
Saisir la taille du hdd (G):
1800
./vm-create-1.2: line 26: [: 1800 : opérateur unaire attendu
./vm-create-1.2: line 31: hdd_free_after_vm : commande introuvable
Il reste:
./vm-create-1.2: line 36: mem_size_free : commande introuvable
Saisir taille ram :
je pense que j'ai un problème au niveau de mes variables où je rentre par exemple la taille libre sur mon raid.

une idée?

merci :D
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

j'avance ^^

avec le script suivant me reste ca comme erreur: ./vm-create-1.2: line 28: 1800 : commande introuvable
#!/bin/bash

#Listing des noms de vm
#`ls /etc/xen/*.cfg | sed 's/.cfg//g' > /etc/xen/liste_vm.txt`

#Saisie du nom de la vm
echo 'Saisir nom vm :'
read name_vm

#Verifie l'existence du nom de la vm
#while [ ! -f /etc/xen/$name_vm.cfg ]
#do
# echo 'La vm existe deja, re-saisir:'
# read name_vm
#done
echo 'Choix du nom termine.'

#Recuperation taille hdd libre
hdd_free=`df -h -B G | tr ' ' '\n' | grep G | tail -1 | tr -d 'G'`

#Saisie taille HDD
echo 'Il reste : ' $hdd_free
echo 'Saisir la taille du hdd (G):'
read hdd_size

#Controle de l'espace libre hdd
if [ $hdd_size -gt $hdd_free ]; then
while $hdd_size > $hdd_free
do echo 'Re-Saisir la taille du hdd:'
read hdd_size
done
else hdd_free_after_vm=$(( $hdd_free - $hdd_size ))
echo 'Il reste: ' $hdd_free_after_vm
fi

#Recupere la memoire libre
mem_size_free=`free -m | grep buffer | tr ' ' '\n' | tail -1`

#Saisie de la taille de la memoire vive
echo 'Saisir taille ram :'
read mem_size

#Verife de l'espace libre memoire
if $mem_size > $mem_size_free then
echo 'Re-Saisir la taille de la memoire:'
read mem_size
else mem_size_after_vm=$mem_size_free - $mem_size
echo 'Il reste: ' $mem_size_after_vm 'Mb'
fi

#Sairsir adresse ip
echo 'Saisir adresse ip :'
read ip_adress

#Saisir distribution
echo 'Saisir la distribution (squeeze - lenny) :'
read distrib_name
while [ $distrib_name != 'squeeze' || $distrib_name != 'lenny' ]; do
#if $distrib_name != 'squeeze' or $distrib_name != 'lenny'
echo 'Re-saisir la distrib (squeeze - lenny) :'
read distrib_name
#fi
done

#Creation vm
echo xen-create-image --hostname=$name_vm --size=$hdd_size'Gb' --fs=ext4 --memory=$mem_size'Mb' --noswap --dist=$distrib_name --arch=amd64 --ip=$ip_adress --netmask=255.255.255.0 --gateway=192.168.1.2 --passwd --role=udev

#Ajout de la vm au tableau
#xm create /etc/xen/$namevm'.cfg'
edit: j'ai ce problème que si je mets une valeur de hdd qui est supérieur à celle dispo.
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

trouvé ^^

me manquait des [] à deux endroits
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par fighting_falcon »

bash -n pour vérifier la syntaxe de son script ;)
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

connaissais pas!! merci!

me reste encore un problème avec la vérification de nom et tout sera bon
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

[cpp]
#Listing des noms de vm
`ls /etc/xen/*.cfg | sed 's/.cfg//g' > /etc/xen/liste_vm.txt`

#Saisie du nom de la vm
echo 'Saisir nom vm :'
read name_vm

#Verifie l'existence du nom de la vm
while [ $name_vm -e '/etc/xen/$name_vm.cfg' ]
do
echo 'La vm existe deja, re-saisir:'
read name_vm
done
echo 'Choix du nom termine.'[/cpp]

je bute sur un truc: ls /etc/xen/*.cfg | sed 's/.cfg//g' > /etc/xen/liste_vm.txt ca me dit aucun fichier de ce type mais ca d'accord, y a moyen de pas afficher cette erreur?

je voudrais comparer le nom de la vm qui a été entré par l'utilisateur avec la liste des vm déjà créées.
Avatar de l’utilisateur
dsebire
Messages : 13160
Inscription : ven. 12 janv. 2018 17:44
Localisation : Loiret - entre la ville et les champs

Script shell : test incorrect et ouverture fichier

Message par dsebire »

hello,

ajoute 2>/dev/null a la fin de ta commande.
ça va renvoyer dans le vide les erreurs retournées par ta commade ;)
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

nickel!! merci :D
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

deux questions:

j'ai ce code:
[cpp]echo 'Saisir le numero de distribution (squeeze 10 - lenny 20 ) :'
read num_distrib

echo $num_distrib

if [ $num_distrib -ne 10 ] || [ $num_distrib -ne 20 ]; then
while [ $num_distrib -ne 10 ] || [ $num_distrib -ne 20 ]; do
echo 'Re-saisir le numero de distrib (squeeze 10 - lenny 20 ) :'
read num_distrib
done
fi[/cpp]

sauf que le test ne fonctionne pas, même si on rentre 10 ou 20, j'ai zappé un truc?

deuxième question: je chercher à comparer un nom au contenu d'un fichier sauf que je pige pas comment faire, un coup de main?

Merci :D
Avatar de l’utilisateur
dsebire
Messages : 13160
Inscription : ven. 12 janv. 2018 17:44
Localisation : Loiret - entre la ville et les champs

Script shell : test incorrect et ouverture fichier

Message par dsebire »

des quotes autout de 10 et 20 ?

pour la comparaison avec le contenu du fichier,
if [ $num_distrib -ne `cat toto.txt` ]; then ...
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

pour 10 et 20 j'ai essayé avec et sans les quotes, même résultat.

pas con le coup du cat :D je test ca ce soir ^^

merci ;)
Avatar de l’utilisateur
dsebire
Messages : 13160
Inscription : ven. 12 janv. 2018 17:44
Localisation : Loiret - entre la ville et les champs

Script shell : test incorrect et ouverture fichier

Message par dsebire »

double quotes ?
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

" au lieu de ' ?

j'ai essayé que les simples '

je testerais ce soir
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par Zedoune »

pourquoi tu fais un if avant le while alors que c'est le même test ?

techniquement, le while c'est un if qui se répète


et tu peux expliquer ta comparaison d'un contenu avec un nom ? :D
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

ouais ho ca va :o

pour la comparaison de nom, je veux comparer le nom entré, aux noms déjà saisis, sachant qu'un nom saisi = un .cfg dans /etc/xen
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par Zedoune »

Code : Tout sélectionner

while [ $num_distrib -ne 10 ] && [ $num_distrib -ne 20 ]; do
        echo 'Re-saisir le numero de distrib (squeeze 10 - lenny 20 ) :'
        read num_distrib
done
fallait utiliser && et pas || et j'ai viré le if qui sert à rien :p

pour la comparaison j'y réfléchis
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

les && c'est pour et et moi je veux du ou:

tant que num_distrib != 10 ou num_distrib != 20

le et va pas avec la comparaison

merci pour la comparaison :jap:
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par Zedoune »

si ça va !

parce que ton test que tu fais c'est:

si num_distrib est différent de 10 ou num_distrib différent de 20, ce qui est toujours vrai puisqu'il peut pas être égal à 10 et 20 à la fois


Il te faut:

si num_distrib est différent de 10 ET est différent de 20, ce qui veut dire qu'il est ni égal à 10, ni égal à 20
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

je pensais pas comme ca dans ma tête ^^

je regarderais ca ce soir ;)
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par fighting_falcon »

plusieurs choses :
if [ cond_a ] || [ cond_b ] ; then
équivalent :
if [ cond_a -o cond_b ] ; then
if [ cond_a ] && [ cond_b ] ; then
équivalent :
if [ cond_a -a cond_b ] ; then
Quand on fait des tests sur des entrées utilisateur (typiquement ton cas), on protège par des doubles quotes, ne serait-ce que pour éviter une variable vide =>
if [ "${maVar}" -eq "0" ] ; then
sans quote :
if [ ${maVar} -eq "0" ] ; then
si ${maVar} renvoie vide, le shell se retrouve à exécuter :
if [ -eq "0" ] ; then
==> ERREUR

Ensuite,
il faut savoir que les doubles quotes indiquent au shell D'INTERPRETER le contenu de la chaine, alors que les simples non :
maVar=2
echo "maVar: ${maVar}"
echo 'maVar: ${maVar}'
donne comme résultat :
maVar: 2
maVar: ${maVar}
Et pour finir :
if [ $num_distrib -ne `cat toto.txt` ]; then
hoouuuu que c'est vilain !!! ;)

les ` sont deprecated => $()
utilisation de cat inutile

=>
if grep -qv $num_distrib cat toto.txt ; then
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par Zedoune »

c'est deprecated depuis quand les ` ?

Et $() c'est POSIX ?
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par fighting_falcon »

http://www.linux-kheops.com/doc/man/man ... tml#sect24
Quand l'ancienne forme de substitution -avec les backquotes `- ...
et oui $() c'est POSIX :
http://pubs.opengroup.org/onlinepubs/96 ... g_18_06_03
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

je mettrais à jour le script tout à l'heure
gizmo78
Messages : 20534
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par gizmo78 »

[cpp]#!/bin/bash

#Saisie du nom de la vm
echo 'Saisir nom vm :'
read name_vm

#Verifie l'existence du nom de la vm
while [ -e '/etc/xen/$name_vm.cfg' ]
do
echo 'La vm existe deja, re-saisir:'
read name_vm
done
echo 'Choix du nom termine.'

#Recuperation taille hdd libre
hdd_free=$(df -h -B G | tr ' ' '\n' | grep G | tail -1 | tr -d 'G')

#Saisie taille HDD
echo 'Il reste : ' $hdd_free
echo 'Saisir la taille du hdd (G):'
read hdd_size

#Controle de l'espace libre hdd
if [ "$hdd_size" -ge "$hdd_free" ]; then
while [ "$hdd_size" -ge "$hdd_free" ]
do echo 'Re-Saisir la taille du hdd:'
read hdd_size
done
else hdd_free_after_vm=$(( $hdd_free - $hdd_size ))
echo 'Il reste: ' $hdd_free_after_vm
fi

#Recupere la memoire libre
mem_size_free=$(xm info | grep free_memory | tr ' ' '\n' | tail -1)
echo 'Reste de ram : ' $mem_size_free

#Saisie de la taille de la memoire vive
echo 'Saisir taille ram :'
read mem_size

#Verife de l'espace libre memoire
if [ "$mem_size" -ge "$mem_size_free" ]; then
while [ "$mem_size" -ge "$mem_size_free" ]
do echo 'Re-Saisir la taille de la memoire:'
read mem_size
done
else mem_size_after_vm=$(( $mem_size_free - $mem_size ))
echo 'Il reste: ' $mem_size_after_vm 'Mb'
fi

#Sairsir adresse ip
echo 'Saisir adresse ip :'
read ip_adress

#Saisir distribution
echo 'Saisir le numero de distribution (squeeze 10 - lenny 20 ) :'
read num_distrib

while [ "$num_distrib" -ne 10 ] && [ "$num_distrib" -ne 20 ]; do
echo 'Re-saisir le numero de distrib (squeeze 10 - lenny 20 ) :'
read num_distrib
done

if [ "$num_distrib" -eq 10 ]; then
distrib_name='squeeze'
else distrib_name='lenny'
fi

echo 'Vous avez choisis la distribution : ' $distrib_name


#Creation vm
xen-create-image --hostname=$name_vm --size=$hdd_size'Gb' --fs=ext4 --memory=$mem_size'Mb' --noswap --dist=$distrib_name --arch=amd64 --ip=$ip_adress --netmask=255.255.255.0 --gateway=192.168.1.2 --nameserver=192.168.1.2

echo 'Voulez-vous lancer la vm tout de suite?'
read answer

if [ $answer = 'oui' ]; then
#Demarrage de la vm
xm create /etc/xen/$namevm'.cfg'
else echo 'Demarrage manuel.'
fi
[/cpp]

mieux comme ca?
fighting_falcon
Messages : 656
Inscription : ven. 12 janv. 2018 17:44

Script shell : test incorrect et ouverture fichier

Message par fighting_falcon »

lignes 23 à 31 et 41 à 49 : code dupliqué ==> fonction

D'ailleurs, l'enchainement :
if
while
else
fi
est bizarre

On pourrait penser que ton if ne sert à rien puisqu'il est totalement repris dans le while ...
Sauf qu'il y a ton else.
Sauf que si tu rentre dans ton if, tu fais ton while, et ensuite, tu ne passes pas dans ton else, donc tu n'affiches jamais l'espace disque/ram restant après l'allocation pour ta nouvelle VM :(

Perso, je ferai :
while allocation_trop_grande
do
répéter_question
done

afficher_espace_restant_après_allocation
echo 'Voulez-vous lancer la vm tout de suite?'
read answer
Question complètement ouverte, si j'exécute ton script sans même lire son code, je ne sais quoi répondre : oui, non, o, n, O, N, yes, no, y, Y ?

Je remplacerai par (le do ... while n'existe pas en base :( ):
# Initialisation
answer=

# Boucle
while [ "${answer}" != "oui" ] && [ "${answer}" != "non" ] ; do
echo 'Voulez-vous lancer la vm tout de suite ? (oui/[non])'
read answer

# Valeur par défaut
if [ ${answer} = "" ] ; then
answer="non"
fi
done
hdd_free=$(df -h -B G | tr ' ' '\n' | grep G | tail -1 | tr -d 'G')
==>
hdd_free=$(df -h -B G|awk '{gsub("G","")}; {field=$4}; END{ print field};')
Répondre