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 17/08/2013, à 19:05

omnimax

if variable = expression , problème

Bonjour,

je me casse les dents sur un truc mais vraiment hyper basique
si $1 (ce que je tape après ma fonction ) est *.(pdf|PDF) alors ....
autrement dit si on me tape essai.pdf alors ...

ici mon petit bout de code où je ne comprends vraiment pas mon erreur, merci pour votre passage éclairant smile

gpdf() 
{
if [ "$#" -eq 0 ]; then 
	echo "vous devez indiquer le nom final du fichier"
elif [ "$1" = "*.(pdf|PDF)" ]; then
	echo "vous ne devez pas mettre l'extension, nous la mettons pour vous"
else 
	echo "ok"
fi
}

Dernière modification par omnimax (Le 17/08/2013, à 19:06)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#2 Le 17/08/2013, à 19:25

pingouinux

Re : if variable = expression , problème

Bonjour,
Je remplacerais la ligne n° 5 par :

elif grep -iq '\.pdf$' <<<"$1"; then

Correction : Ajout de $ après .pdf

Dernière modification par pingouinux (Le 17/08/2013, à 19:29)

Hors ligne

#3 Le 17/08/2013, à 20:34

omnimax

Re : if variable = expression , problème

Merci pingouinux,

Mais pourrais-tu m'expliquer pourquoi ma ligne ne fonctionne pas ? Car c'est clair que sous une autre forme j'arriverais à le faire fonctionner. J'aimerai comprendre  : pourquoi ce qui pour moi est parfaitement logique et "construit" ne fonctionne pas

Dernière modification par omnimax (Le 17/08/2013, à 20:36)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#4 Le 17/08/2013, à 21:08

pingouinux

Re : if variable = expression , problème

Ceci marche aussi, mais je ne sais pas regrouper les deux tests :

elif [[ $1 == *.pdf || $1 == *.PDF ]]; then

Ajouté : Il y a aussi ceci

elif [[ ${1,,} == *.pdf ]]; then

Dernière modification par pingouinux (Le 17/08/2013, à 21:43)

Hors ligne

#5 Le 17/08/2013, à 22:40

aduxas

Re : if variable = expression , problème

omnimax a écrit :

Mais pourrais-tu m'expliquer pourquoi ma ligne ne fonctionne pas ?

Est-ce par hasard parce que

"$1" = "*.(pdf|PDF)"

remplace le premier argument par la chaîne "*.(pdf|PDF)" ? Le signe égal assigne une valeur à une variable; répété, il représente un test logique dont le résultat est vrai ou faux.

man bash a écrit :

A variable may be assigned to by a statement of the form

              name=[value]
...

When the == and != operators are used, the string to the right of the operator is  considered  a  pattern  and  matched  according to the rules described below under Pattern Matching.  If the shell option nocasematch is enabled, the match is  performed  without regard  to  the  case  of  alphabetic  characters.  The return value is 0 if the string matches (==) or does not match (!=) the pattern, and 1 otherwise.

Hors ligne

#6 Le 17/08/2013, à 23:30

omnimax

Re : if variable = expression , problème

Merci bien pour ces explications.

Aduxas, je suis honteux de n'avoir jamais lu ce man sur bash, je l'imprime lundi et je m'y attarde smile

pingouinux, j'ai trouvé pour mettre les deux conditions en une ligne

elif [[ $1 == *.(pdf|PDF) ]]

Pour info et pour vous remercier, votre aide m'a permis de réaliser le bout de code ci-dessous.
j'ai par exemple 10 fichiers pdf différents dans un répertoire, je lance la fonction gpdf NOMDUFICHIERVOULU  et il me rassemble le tout en un fichier unique, puis réduit sa taille de manière affolante (parfois je passe d'un fichier de 40MO À 5MO sans perdre en qualité. Après c'est un peu des config pour moi, il lit un fichier musical pour me dire que la commande est finie, puis fait un listing des fichiers pour voir la réduction opérée en taille. Fonction hyper pratique pour un envoi par mail conventionnel big_smile

gpdf() 
# usage : gpdf nomdufichiergroupéréduit
{
if [ "$#" -eq 0 ]; then 
	echo "vous devez indiquer le nom final du fichier"
elif [[ $1 == *.(pdf|PDF) ]]; then
	echo "vous ne devez pas mettre l'extension, nous la mettons pour vous"
else 
	pdftk *.(pdf|PDF) cat output "$1".pdf && gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf "$1".pdf && mv out.pdf "$1".pdf && mplayer $HOME/Musique/voice-system-activated.wav && ls -l -t -h
fi
}

ici simplement le script pour réduire un fichier pdf

rpdf() 
# usage : rpdf fichier.pdf
{
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf "$1"
nouveau=$1
mv out.pdf ${nouveau%.*}.pdf && ls -l -t -h
}

Dernière modification par omnimax (Le 17/08/2013, à 23:39)


14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#7 Le 18/08/2013, à 10:05

pingouinux

Re : if variable = expression , problème

omnimax #6 a écrit :

pingouinux, j'ai trouvé pour mettre les deux conditions en une ligne

elif [[ $1 == *.(pdf|PDF) ]]

Voici le message d'erreur que j'obtiens avec ça :

./x: line 8: syntax error in conditional expression: unexpected token `('
./x: line 8: syntax error near `*.(p'
./x: line 8: `elif [[ $1 == *.(pdf|PDF) ]]'

Dernière modification par pingouinux (Le 18/08/2013, à 10:06)

Hors ligne

#8 Le 18/08/2013, à 10:32

omnimax

Re : if variable = expression , problème

pingouinux,

tu n'as pas par hasard oublié le point-virgule après les parenthèses ?

elif [[ $1 == *.(pdf|PDF) ]];

14.04 unity et Linux Mint KDE 13 zsh-meilleur shell   script fire

Hors ligne

#9 Le 18/08/2013, à 11:35

pingouinux

Re : if variable = expression , problème

tu n'as pas par hasard oublié le point-virgule après les parenthèses ?

Ça ne change rien. Le ; ne sert qu'à séparer les commandes lorsqu'il y en a plusieurs sur une ligne. Et ce sont des crochets, non des parenthèses

Hors ligne

#10 Le 18/08/2013, à 12:27

Watael

Re : if variable = expression , problème

salut,

man bash /Motifs génériques !

$ pat="*.@(pdf|PDF)"
$ f="bla bla.pdf"
$ [[ $f == $pat ]] && echo ok || echo ko
ok
$ f="bla bla.PDF"
$ [[ $f == $pat ]] && echo ok || echo ko
ok
$ f="bla bla.bla"
$ [[ $f == $pat ]] && echo ok || echo ko
ko

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 18/08/2013, à 18:27

nesthib

Re : if variable = expression , problème

Si c'est du bash 4 :

[[ ${1,,} == *.pdf ]]

tongue

@Watael : il faut préciser que l'option extglob doit être active

edit : je vois que pingouinux a déjà proposé le « ,, »

Dernière modification par nesthib (Le 18/08/2013, à 18:36)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#12 Le 18/08/2013, à 18:49

pingouinux

Re : if variable = expression , problème

@Watael : Merci pour ce rappel

Hors ligne

#13 Le 18/08/2013, à 23:43

Watael

Re : if variable = expression , problème

nesthib a écrit :

il faut préciser que l'option extglob doit être active

man bash a écrit :

[[ expression ]]
[...]
Quand  les opérateurs == et != sont utilisés, la chaîne placée à droite de l'opérateur est considé‐
rée comme étant un motif dont la correspondance est recherchée selon les règles décrites ci-dessous
dans  Motifs  génériques.

il n'en est pas fait mention

$ shopt extglob
extglob         off
$ pat="*.@(pdf|PDF)"
$ f="bla bla.bla"
$ [[ $f == $pat ]] && echo ok || echo ko
ko
$ f="bla bla.pdf"
$ [[ $f == $pat ]] && echo ok || echo ko
ok

on pourrait utiliser nocasematch:

shopt -s nocasematch; [[ ${f##*.} = pdf ]] && echo ok || echo ko

Dernière modification par Watael (Le 18/08/2013, à 23:58)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne