#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
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
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.
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
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
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
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 ]]
@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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
il faut préciser que l'option extglob doit être active
[[ 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