#1 Le 16/11/2010, à 00:47
- karch
[RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
J'utilise un script bash qui me retourne l'espace libre si mon volume est monté
a savoir :
usb=`mount | grep "/usb" | awk '{print $3}'`
et par la suite
if [ -n "$usb" ]
then
echo "Espace libre /mnt/usb : "$usbval" #ici $usbval me revoit l'occupation du disque (5eme colone d'un df -h)
else
echo "/mnt/usb n'est pas monté"
fi
Probleme (mais pas génant cela dit
j'ai une erreur : (standard_in) 1: syntax error au début de mon script
Une idée ?
Dernière modification par karch (Le 18/11/2010, à 00:39)
Hors ligne
#2 Le 16/11/2010, à 00:53
- karch
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
A noter qu'il ne me retourne l'erreur que si le volume n'est pas monté
grosso modo si la valeur est "null"
ce qui est curieux puisque c'est le but de mon "if" ...
Idem si j'utilise un "case"
Dernière modification par karch (Le 16/11/2010, à 00:56)
Hors ligne
#3 Le 16/11/2010, à 01:52
- ehmicky
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
Salut,
Déjà, il y a des guillemets non fermés avec "Espace libre etc.", mais peut-être que c'est dû à ton copier/coller : peux-tu poster le script complet ?
Sinon, est-ce que ça bugue toujours avec des test [[ ]] et non [ ] ?
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#4 Le 16/11/2010, à 11:54
- karch
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
Oui pour les guillemets c'etait juste le copier/colelr
Alors le script complet, ba c'est celui que j'ai mis, enfin du moins pour les lignes concernées
usb=`mount | grep "/usb" | awk '{print $3}'`
if [ -n "$usb" ] ; then
echo "Espace libre /mnt/usb : $usbval"
else
echo "/mnt/usb n'est pas monté"
fi
Et si je mets des [[ ]]
ca me retourne : [[: not found
Par contre ce qui me gêne c'est que si le periph est monté, le if ne retourne aucune erreur ....
Bon cela dit ce n'est pas vraiment une erreur, certes il met le message au debut du script mais le if est bien exécuté
Dernière modification par karch (Le 16/11/2010, à 12:00)
Hors ligne
#5 Le 16/11/2010, à 15:28
- Totor
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
copie/colle tout ton script (et dans une balise "code")
poste également le résultat de ta sortie en rajoutant "set -x" dans ton script
par ailleurs, je suis surpris que l'utilisation de [[ provoque une erreur.
utilises-tu réellement bash ?
Dernière modification par Totor (Le 17/11/2010, à 10:40)
-- Lucid Lynx --
Hors ligne
#6 Le 16/11/2010, à 16:12
- ehmicky
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
Effectivement, vérifie que tu as #!/bin/bash en début de script et non #!/bin/sh
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#7 Le 17/11/2010, à 09:09
- karch
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
#!/bin/bash
#VARIABLES
usb1=$(mount | grep "/usb" | awk '{print $3}')
usb=$(df -h | grep "/usb" | awk '{print $4}' | sed "s/G//")
usbtt=$(df -h | grep "/usb" | awk '{print $2}' | sed "s/G//")
usbval1=$(df -h | grep "/usb" | awk '{print $5}' | sed "s/"%"//")
usbval=$(echo "(100 - $usbval1)" | bc -l)
#
if [ -n "$usb1" ]
then
echo "Espace libre /mnt/usb : $usbval% ($usb Go / $usbtt Go)"
else
echo "/mnt/usb n'est pas monté"
fi
RESULTAT :
root@ubuntu:~# /usr/sbin/pc_info
(standard_in) 1: syntax error
/mnt/usb n'est pas monté
Donc le résultat donné est bon, en effet la partoche usb n'est pas montée, mais j'ai l'erreur ...
Dernière modification par karch (Le 17/11/2010, à 09:11)
Hors ligne
#8 Le 17/11/2010, à 09:15
- karch
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
Pour info aussi
si je mets, #!/bin/sh ou #!/bin/bash ca ne change rien
si ce n'est que je n'ai pas les couleurs dans le terminal en #!/bin/bash
Et oui je vous ai fait grace des : \033[01;037m ... \033[00;00m dans mon copier/coller, fortement illisible ... ;-)
Hors ligne
#9 Le 17/11/2010, à 10:48
- Totor
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
élément de réponse à ton problème : à ton avis, si tu essaies de calculer 100-<vide>, ça donne quoi ?
par contre, y'a divers choses dans ton script qui peuvent être améliorées mais pas le temps de m'en occuper.
PS : il serait bon que tu utilises la balise "code" pour poster du code
Dernière modification par Totor (Le 17/11/2010, à 10:49)
-- Lucid Lynx --
Hors ligne
#10 Le 17/11/2010, à 17:13
- ehmicky
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
Comme le dit Totor, l'erreur vient du fait que quand /mnt/usb n'est pas monté, la variable $usbval est vide, et donc tu envoies à bc la commande "100 - " qui produit une erreur.
Tu peux par exemple faire :
#!/bin/bash
info=( $(df -h | grep "$1") )
if [[ -z $info ]]
then
echo "$1 n'est pas monté"
exit 1
fi
echo "Espace libre $1 : $(( 100 - ${info[4]//%} ))% (${info[3]} / ${info[1]})"
Exécution :
$ ./script.sh /mnt/usb
Espace libre /mnt/usb : 85% (45G / 56G)
Edit : je propose ça parce que :
- ça t'évite de faire une répétition de df | awk | sed
- tu enlèves les G alors que tu n'es pas sûr que l'espace occupé et libre sera chiffré en Go et pas en Mo ou Ko
- tu cherches "/usb" et non "/mnt/usb/", du coup tu pourrais attraper par exemple une partition nommée /mnt/usb2/ ou autre
- tu n'utilises pas la variable usb1 sauf pour le test.
Edit 2 : prenant en compte le post de Totor
Edit 3 : même chose
Dernière modification par ehmicky (Le 17/11/2010, à 22:49)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#11 Le 17/11/2010, à 17:36
- twocats
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
Allez, pour le fun :
#!/bin/bash
usb1=$(mount | awk '/\/usb/ {print $3}')
if [[ -z $usb1 ]]
then
echo "/mnt/usb n'est pas monté"
exit 1
fi
usb=$(df -h | awk '/\/usb/ {sub(/G/, ""); print $4}')
usb=$(df -h | awk '/\/usb/ {sub(/G/, ""); print $2}')
usb=$(df -h | awk '/\/usb/ {sub(/%/, ""); print $5}')
usbval=$(( 100 - $usbval1))
echo "Espace libre /mnt/usb : $usbval% ($usb Go / $usbtt Go)"
La réponse est 42
Hors ligne
#12 Le 17/11/2010, à 19:55
- Totor
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
My turn :
#!/bin/bash
mountPoint="$1"
{ read; read -a infos ; } < <(df -h ${mountPoint} 2>/dev/null) && echo "Espace libre ${mountPoint} : $(( 100 - ${infos[4]%\%} ))% (${infos[3]} / ${infos[1]})" || { echo "${mountPoint} n'est pas monté"; exit 1; }
Dernière modification par Totor (Le 17/11/2010, à 19:58)
-- Lucid Lynx --
Hors ligne
#13 Le 17/11/2010, à 21:01
- ehmicky
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
@Totor : je me trompe peut-être mais "... n'est pas monté" et "exit 1" ne s'exécuteront que si le point de montage n'existe pas, et non s'il n'est pas monté.
Je m'explique : si /mnt/usb existe, mais est un répertoire vide (pas de montage), df -h ciblera la partition root (à supposer que /mnt soit sur la partition root) et retournera un exit code de succès, alors qu'il faudrait un exit code d'échec.
Je me trompe peut-être
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#14 Le 17/11/2010, à 22:21
- Totor
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
@ehmicky : effectivement ! le pire c'est que je me suis fait la réflexion
Bon, rien de bien méchant :
#!/bin/bash
mountPoint="$1"
{ read; read -a infos ; } < <(df -h ${mountPoint} 2>/dev/null) && [ "${mountPoint%/}" = "${infos[5]}" ] && echo "Espace libre ${mountPoint} : $(( 100 - ${infos[4]%\%} ))% (${infos[3]} / ${infos[1]})" || { echo "${mountPoint} n'est pas monté"; exit 1; }
En fait, voilà pourquoi j'évite d'utiliser l'instruction mount pour lister les points de montage :
[..]
The /etc/fstab, /etc/mtab and /proc/mounts files.
The programs mount and umount maintain a list of currently mounted filesystems in the file /etc/mtab. If no arguments are given to mount, this list is printed.
[..]
When the proc filesystem is mounted (say at /proc), the files /etc/mtab and /proc/mounts have very similar contents. The former has somewhat more information,
such as the mount options used, but is not necessarily up-to-date (cf. the -n option below). It is possible to replace /etc/mtab by a symbolic link to
/proc/mounts, and especially when you have very large numbers of mounts things will be much faster with that symlink, but some information is lost that way, and
in particular using the "user" option will fail.
[..]
-n, --no-mtab
Mount without writing in /etc/mtab. This is necessary for example when /etc is on a read-only filesystem
[..]
Il est donc préférable d'exploiter /proc/mounts que d'utiliser mount qui se base sur /etc/mtab.
Mais comme on peut obtenir toutes les infos dans le résultat de df, il n'est donc pas utile de lire /proc/mounts,
Dernière modification par Totor (Le 17/11/2010, à 22:22)
-- Lucid Lynx --
Hors ligne
#15 Le 18/11/2010, à 00:38
- karch
Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error
Ca baigne !
Merci à tous
Hors ligne