gratifiant > comp.os.* > comp.os.unix

Dominique MICOLLET (15/10/2015, 09h40)
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
Lucas Levrel (15/10/2015, 12h10)
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')

;-)
Nicolas George (15/10/2015, 12h14)
Lucas Levrel , dans le message
<alpine.LSU.2.10.1510151206410.5794>, 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.
Francois Lafont (15/10/2015, 13h03)
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.
Nicolas George (15/10/2015, 17h31)
Francois Lafont , dans le message
<561f8802$0$3323$426a74cc>, 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.
Francois Lafont (15/10/2015, 23h23)
On 15/10/2015 17:31, Nicolas George wrote:
[..]
> résultat va dépendre de la version du shell et d'echo.236a74cc>, a écrit :
> 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 'aaaa\tbbbb' # là le \t devient une tabulation.
aaaa bbbb

> Oui.
> 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 '%s\n' "$arg1" | cat
-------------------------

Est-ce bien cela que tu voulais dire ?
En tout cas merci bien, ça me servira ce « truc ».
Nicolas George (16/10/2015, 00h18)
Francois Lafont , dans le message
<56201934$0$3082$426a34cc>, a écrit :
> printf '%s\n' "$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.
Francois Lafont (16/10/2015, 00h33)
On 16/10/2015 00:18, Nicolas George wrote:

> 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).
Discussions similaires