Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/11/2010, à 01: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, à 01:39)

Hors ligne

#2 Le 16/11/2010, à 01: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, à 01:56)

Hors ligne

#3 Le 16/11/2010, à 02: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, à 12: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, à 13:00)

Hors ligne

#5 Le 16/11/2010, à 16: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, à 11:40)


-- Lucid Lynx --

Hors ligne

#6 Le 16/11/2010, à 17: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, à 10: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, à 10:11)

Hors ligne

#8 Le 17/11/2010, à 10: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, à 11: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 ? roll

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 hmm

Dernière modification par Totor (Le 17/11/2010, à 11:49)


-- Lucid Lynx --

Hors ligne

#10 Le 17/11/2010, à 18: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, à 23: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, à 18: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, à 20: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, à 20:58)


-- Lucid Lynx --

Hors ligne

#13 Le 17/11/2010, à 22: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 smile


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, à 23: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 hmm
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 :

man mount a écrit :

[..]
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, à 23:22)


-- Lucid Lynx --

Hors ligne

#15 Le 18/11/2010, à 01:38

karch

Re : [RESOLU] Suite "if" erreur : (standard_in) 1: syntax error

Ca baigne !
Merci à tous tongue

Hors ligne