# Bash: passer une liste à un script

**URL:** <https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193>\
**Category:** Programmation\
**Created:** [Mai 11, 2023, 9:56 UTC](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193 "2023-05-11T09:56:41Z")\
**Posts on this page:** 7\
**Page:** 2

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Mai 16, 2023, 5:00 UTC](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193/21 "2023-05-16T17:00:14Z")

</div>

Dans l’hypothèse où le travail de recherche de «&nbsp;méta-données&nbsp;» est déjà disponible en amont dans un fichier index.csv, une seule commande suffira pour renommer les fichiers:

Démonstration/préparation test:

```auto
$ mkdir /tmp/test ;cd /tmp/test ;touch {a,b,c}1.jpg
$ cat << EOF > index.csv
a1.jpg,a2.jpg
b1.jpg,b2.jpg
c1.jpg,c2.jpg
EOF

```

```auto
$ ls
a1.jpg b1.jpg c1.jpg

```

```auto
$ awk -F, '{system("mv "$1" "$2)}' index.csv
$ ls *.jpg
a2.jpg b2.jpg c2.jpg

```

La conclusion claire et sans appel est bien que la difficulté n’est pas dans le «&nbsp;_comment_&nbsp;» faire, mais dans le «&nbsp;_quoi_&nbsp;», la définition de ce qu’il faut faire, en fournissant un kit de test.

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Mai 19, 2023, 2:42 UTC](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193/22 "2023-05-19T14:42:35Z")

</div>

Toutes ces solutions sont intéressantes, et je vous en remercie.  
Mais elles me disent comment faire autre-chose ce que je cherche.  
Ma recherche est plus générale que le simple exemple de renommer en fonction de ses métadonnées (ça pourrait aussi bien être des extraits de texte ou d’autres informations… toutes choses que je sais ou pourrais faire en ligne de commande sur une liste).

La question initiale aurait due être, (indépendamment de l’exemple de renommage): est-il possible passer simplement à un _script bash_ une liste de noms de fichiers donnée par des _jockers bash_, comme on peut le faire avec _Perl5_ et sa fonction _glob_ (si je me souviens bien de mes très vieux souvenirs de débutant autodidacte).

Je viens de trouver, un vieux script oublié depuis longtemps, à peine modifié (boucle while pour utiliser facilement le nombre d’arguments).  
La syntaxe ${!variable} de bash – que j’avais oubliée depuis longtemps – est une fonction «eval» sur la variable.

Le script suivant marche très simplement, à ma grande surprise (et peut-être à la votre?)

```
#!/bin/bash --
NBARG=$#
echo " $NBARG arguments reçus par le script"
i=0
while [["$i" -lt "$NBARG"]] 
do
        ((i++))
        echo "Rang: $i → fichier: ${!i}"
done

#La syntaxe ${!variable} est une fonction «eval» sur $variable

```

Ce qui donne par exemple:  
`$TableauDArguments.sh *bkp r*txt`

```
 13 arguments reçus par le script
Rang: 1 → fichier: BKP_incrementale.bkp
Rang: 2 → fichier: IdentifierUSBrsync.sh.bkp
Rang: 3 → fichier: lscl.bkp
Rang: 4 → fichier: parallel.bkp
Rang: 5 → fichier: projet_latex.bkp
Rang: 6 → fichier: rsyncClevoSamsung2T.sh.bkp
Rang: 7 → fichier: rsyncClevoToshiba.sh.bkp
Rang: 8 → fichier: rsync_Elements.sh.INIbkp
Rang: 9 → fichier: svmi.bkp
Rang: 10 → fichier: rsyncECMbash.txt
Rang: 11 → fichier: rsyncSeagate4Tsimplifie.txt
Rang: 12 → fichier: rsyncStructureBug.txt
Rang: 13 → fichier: rsyncStructure.txt

```

Évidemment dans la boucle while, je peux enfin faire ce que je veux, comme:

Extraire un champs dans les metadonnées (par exemple champs date de la photo, à défaut champs de dernière modification, à défaut date du fichier) et l’utiliser pour renommer le fichier d’un nom plus humain!.

Je suis désolé ne n’avoir pas su m’expliquer plus clairement, mais surpris que ce script si simple fonctionne !

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Mai 19, 2023, 4:32 UTC](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193/23 "2023-05-19T16:32:10Z")

</div>

Bonjour

En utilisant la commande `shift` :

```auto
#!/bin/bash

while test ! -z "$1"; do
    ((i++))
    echo "$i -> '$1'"
    shift
done

```

* * *

Pour aller directement à la page du manuel de `bash` concernée par la commande `shift`  
lancez la ligne de commande suivante :

```auto
man --pager='less -p "shift \["' bash

```

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Mai 20, 2023, 9:48 UTC](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193/24 "2023-05-20T09:48:50Z")

</div>

> [@anon29980398](#):
>
> En utilisant la commande `shift` :

_shift_ est effectivement plus simple et efficace.

J’ai préféré utiliser ici la variable « $# », parce qu’elle montre simplement qu’on peut passer à un script une liste de fichiers avec les jockers de bash.

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Mai 20, 2023, 12:22 UTC](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193/25 "2023-05-20T12:22:40Z")

</div>

> [@josephtux](#):
>
> … J’ai préféré utiliser ici la variable « $# », …

* * *

**`[Hors sujet]`**

Et on pourrait même utiliser `$#`  
pour inverser l’ordre de la numérotation :

```auto
#!/bin/bash

while test ! -z "$1"; do
    echo "$# -> '$1'"
    shift
done

```

**`[/Hors sujet]`**

---

<div class="post-metadata">

**Author:** ![debcat](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/f1d935/32.png) [@debcat](https://www.debian-fr.org/u/debcat)\
**Post date:** [Septembre 16, 2023, 4:40 UTC](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193/26 "2023-09-16T16:40:28Z")

</div>

Bonjour Désole du détarage mais  
`jhead -n%Y-%m-%d-%H-%M-%S *`  
renome tous les jpg avec l’heure de création par exemple.  
-nunmom pour indiquer un nom en plus de la date

---

<div class="post-metadata">

**Author:** ![anon2873143](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/ee59a6/32.png) [@anon2873143](https://www.debian-fr.org/u/anon2873143)\
**Post date:** [Novembre 9, 2023, 3:30 UTC](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193/27 "2023-11-09T03:30:51Z")

</div>

Bonjour,

Je me disais tout bas que la bonne méthode était peut - être de regarder $# pour parcourir $1 à $$#.

[Page précédente](https://www.debian-fr.org/t/bash-passer-une-liste-a-un-script/88193.md?page=1)
