Page 1 sur 2
Script shell : test incorrect et ouverture fichier
Publié : sam. 2 avr. 2011 13:53
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

Script shell : test incorrect et ouverture fichier
Publié : sam. 2 avr. 2011 14:09
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.
Script shell : test incorrect et ouverture fichier
Publié : sam. 2 avr. 2011 14:20
par gizmo78
trouvé ^^
me manquait des [] à deux endroits
Script shell : test incorrect et ouverture fichier
Publié : sam. 2 avr. 2011 17:49
par fighting_falcon
bash -n pour vérifier la syntaxe de son script

Script shell : test incorrect et ouverture fichier
Publié : sam. 2 avr. 2011 23:51
par gizmo78
connaissais pas!! merci!
me reste encore un problème avec la vérification de nom et tout sera bon
Script shell : test incorrect et ouverture fichier
Publié : dim. 3 avr. 2011 00:05
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.
Script shell : test incorrect et ouverture fichier
Publié : dim. 3 avr. 2011 10:14
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

Script shell : test incorrect et ouverture fichier
Publié : dim. 3 avr. 2011 11:11
par gizmo78
nickel!! merci

Script shell : test incorrect et ouverture fichier
Publié : dim. 3 avr. 2011 22:06
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

Script shell : test incorrect et ouverture fichier
Publié : dim. 3 avr. 2011 22:29
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 ...
Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 08:33
par gizmo78
pour 10 et 20 j'ai essayé avec et sans les quotes, même résultat.
pas con le coup du cat

je test ca ce soir ^^
merci

Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 08:34
par dsebire
double quotes ?
Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 09:17
par gizmo78
" au lieu de ' ?
j'ai essayé que les simples '
je testerais ce soir
Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 12:31
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 ?

Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 12:35
par gizmo78
ouais ho ca va
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
Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 12:38
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
pour la comparaison j'y réfléchis
Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 12:48
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

Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 13:50
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
Script shell : test incorrect et ouverture fichier
Publié : lun. 4 avr. 2011 14:08
par gizmo78
je pensais pas comme ca dans ma tête ^^
je regarderais ca ce soir

Script shell : test incorrect et ouverture fichier
Publié : mer. 6 avr. 2011 19:47
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
Script shell : test incorrect et ouverture fichier
Publié : mer. 6 avr. 2011 19:56
par Zedoune
c'est deprecated depuis quand les ` ?
Et $() c'est POSIX ?
Script shell : test incorrect et ouverture fichier
Publié : jeu. 7 avr. 2011 08:37
par fighting_falcon
Script shell : test incorrect et ouverture fichier
Publié : jeu. 7 avr. 2011 08:39
par gizmo78
je mettrais à jour le script tout à l'heure
Script shell : test incorrect et ouverture fichier
Publié : jeu. 7 avr. 2011 08:46
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?
Script shell : test incorrect et ouverture fichier
Publié : ven. 8 avr. 2011 11:10
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};')