50 votes

Variable contenant plusieurs arguments avec des guillemets dans Bash

Je génère une variable bash contenant tous mes arguments et ces arguments contiennent des espaces. Lorsque je lance une commande avec ces arguments - par exemple. ls $args - les guillemets ne sont pas correctement interprétés. Voici un exemple - créant et effaçant également les fichiers nécessaires.

 #!/bin/bash
f1="file n1"
f2="file n2"
# create files
touch "$f1" "$f2"
# concatenate arguments
args="\"$f1\" \"$f2\""
# Print arguments, then launch 'ls' command
echo "arguments :" $args
ls $args
# delete files
rm "$f1" "$f2"

Avec cela, j'ai quelques erreurs "no such file" pour "file , n1" , "file and n2"

79voto

martin clayton Points 41306

Vous pouvez envisager d'utiliser un tableau pour les arguments, quelque chose comme ceci :

 args=( "$f1" "$f2" )
ls "${args[@]}"

(Le problème que vous rencontrez en ce moment est qu'une fois l'interpolation effectuée, il n'y a plus de différence entre les espaces intra- et inter-nom de fichier.)

9voto

tripleee Points 28746

Utilisez set pour définir vos variables en tant que paramètres de position ; alors les guillemets seront conservés si vous vous y référez via "$@" ou "$1" , "$2" , etc. Assurez-vous d'utiliser des guillemets doubles autour de vos noms de variables.

 set -- "$f1" "$f2"
touch "$@"
ls "$@"
rm "$@"

5voto

David Grayson Points 22459

C'est probablement la pire réponse, mais vous pouvez changer IFS . C'est le "séparateur de champ interne" et est égal à espace+tab+nouvelle ligne par défaut.

 #!/bin/sh
IFS=,
MAR="-n,my file"
cat $MAR

Le script ci-dessus exécutera cat . Le premier argument sera -n (lignes numérotées) et le deuxième argument sera my file .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X