bash : combiner %% et / dans une expansion

7 réponses
Avatar
Dominique MICOLLET
Bonjour,

Ayant eu à convertir un ensemble de fichiers en modifiant leur extension et
en remplaçant les blancs de leur nom par un point, j'ai utilisé :

for nom in *.JPG ; do CIBLE=${nom%%.JPG}; convert "$nom" -geometry 600x600 -
rotate 270 ${CIBLE// /.}.eps; done

(convert réalise la conversion JPG->eps avec mise à l'échelle et rotation)

A B C.JPG devient A.B.C.eps

Existe-t'il un moyen d'écrire l'expansion sans user de CIBLE ?

Cordialement

Dominique

7 réponses

Avatar
Lucas Levrel
Le 15 octobre 2015, Dominique MICOLLET a écrit :

for nom in *.JPG ; do CIBLE=${nom%%.JPG}; convert "$nom" -geometry 600x600 -
rotate 270 ${CIBLE// /.}.eps; done

A B C.JPG devient A.B.C.eps

Existe-t'il un moyen d'écrire l'expansion sans user de CIBLE ?



$(echo $nom | sed 's/.JPG$//;s/ /./g')

;-)

--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
Avatar
Nicolas George
Lucas Levrel , dans le message
, a écrit :
$(echo $nom | sed 's/.JPG$//;s/ /./g')



Ne jamais utiliser echo avec des données provenant de l'extérieur. C'est à
réserver à du texte élémentaire directement présent dans le script.
Avatar
Francois Lafont
Bonjour,

On 15/10/2015 12:14, Nicolas George wrote:

Ne jamais utiliser echo avec des données provenant de l'extérieur. C'est à
réserver à du texte élémentaire directement présent dans le script.



Et par exemple avec ça (je mets des doubles quotes au niveau du echo) :

----------------------------
#!/bin/sh

arg1="$1"
echo "$arg1" | un_prog
----------------------------

Il y a un risque ? Attention (entendons-nous bien ;)), ma question précise
est : est-il possible avec le script ci-dessus que le programme "un_prog"
reçoive en entrée un flux qui soit différent de l'argument 1 passé au
script (une fois celui-ci développé par le shell etc. bien sûr) ? Si oui,
est-ce possible d'avoir un exemple ?

Sinon, c'est vrai que echo est une commande très fourbe, mais que faut-il
utiliser à la place ? printf ? Le souci avec printf, c'est que si par
exemple la variable contient un "%", ça va changer son comportement et ça
va mettre la pagaille, non ?

Je suis très intéressé par des réponses à ces questions étant donné
qu'il m'arrive assez souvent de faire des scripts en shell.

--
François Lafont
Avatar
Nicolas George
Francois Lafont , dans le message
<561f8802$0$3323$, a écrit :
Il y a un risque ? Attention (entendons-nous bien ;)), ma question précise
est : est-il possible avec le script ci-dessus que le programme "un_prog"
reçoive en entrée un flux qui soit différent de l'argument 1 passé au
script (une fois celui-ci développé par le shell etc. bien sûr) ? Si oui,
est-ce possible d'avoir un exemple ?



Essaie avec arg1 qui contient des backslashes ou commence par un tiret. Le
résultat va dépendre de la version du shell et d'echo.

Sinon, c'est vrai que echo est une commande très fourbe, mais que faut-il
utiliser à la place ? printf ?



Oui.

Le souci avec printf, c'est que si par
exemple la variable contient un "%", ça va changer son comportement et ça
va mettre la pagaille, non ?



Non, le premier argument de printf doit (presque) toujours être constant.
Avatar
Francois Lafont
On 15/10/2015 17:31, Nicolas George wrote:
Francois Lafont , dans le message
<561f8802$0$3323$, a écrit :
Il y a un risque ? Attention (entendons-nous bien ;)), ma question précise
est : est-il possible avec le script ci-dessus que le programme "un_prog"
reçoive en entrée un flux qui soit différent de l'argument 1 passé au
script (une fois celui-ci développé par le shell etc. bien sûr) ? Si oui,
est-ce possible d'avoir un exemple ?



Essaie avec arg1 qui contient des backslashes ou commence par un tiret. Le
résultat va dépendre de la version du shell et d'echo.



Ah ah, bien vu. ;)
En effet, en prenant ce script :

-------------------------
#!/bin/sh

arg1="$1"
echo "$arg1" | cat
-------------------------

~$ /tmp/test.sh '-n' # là rien ne s'affiche.

~$ /tmp/test.sh 'aaaatbbbb' # là le t devient une tabulation.
aaaa bbbb

Sinon, c'est vrai que echo est une commande très fourbe, mais que faut-il
utiliser à la place ? printf ?



Oui.

Le souci avec printf, c'est que si par
exemple la variable contient un "%", ça va changer son comportement et ça
va mettre la pagaille, non ?



Non, le premier argument de printf doit (presque) toujours être constant.



Ah ok, donc si je te suis bien, pour faire propre, il faut que
je fasse ça :

-------------------------
#!/bin/sh

arg1="$1"
printf '%sn' "$arg1" | cat
-------------------------

Est-ce bien cela que tu voulais dire ?
En tout cas merci bien, ça me servira ce « truc ».

--
François Lafont
Avatar
Nicolas George
Francois Lafont , dans le message
<56201934$0$3082$, a écrit :
printf '%sn' "$arg1" | cat
Est-ce bien cela que tu voulais dire ?



Exactement.

Note que pour les cas simples :

cat <<EOF
$arg1
EOF

doit faire l'affaire aussi.
Avatar
Francois Lafont
On 16/10/2015 00:18, Nicolas George wrote:

Est-ce bien cela que tu voulais dire ?



Exactement.

Note que pour les cas simples :

cat <<EOF
$arg1
EOF

doit faire l'affaire aussi.



Ok, merci bien... ;)

... et désolé Dominique pour cette petite digression sur votre fil
de discussion, pour lequel je n'ai d'ailleurs pas la moindre idée de
solution (en général j'essaye autant que possible de ne pas utiliser
des commandes propres à bash).

--
François Lafont