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 :D

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 :D

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 :D

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 :D 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 ? :D

Script shell : test incorrect et ouverture fichier

Publié : lun. 4 avr. 2011 12:35
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

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 :p

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 :jap:

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
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

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};')