0

Je voudrais utiliser un certain nombre d'arguments définis dans une variable lors de l'exécution d'une commande. Permettez-moi d'illustrer le cas avec un exemple simple:Passage d'arguments d'une variable avec des espaces blancs

Dites que je veux copier un fichier d'une destination à l'autre et que je vais fournir les arguments pour cp à travers une variable. Il fonctionne très bien lorsque les arguments ne contiennent pas d'espaces:

#!/bin/sh 
ARGS="file1 file2" 

cp $ARGS 

strace montre ce qui suit l'interprétation attendue:

execve("/bin/cp", ["cp", "file1", "file2"] 

Cependant quand j'utilise des arguments avec des espaces que je ne peux pas le faire fonctionner. Je l'ai essayé de mettre chaque argument entre guillemets se sont échappés et bien d'autres choses, mais il est interprété comme arguments individuels:

#!/bin/sh 
ARGS="\"file1\" \"file2\"" 

cp $ARGS 

le résultat est deux arguments, mais quatre:

execve("/bin/cp", ["cp", "\"file", "1\"", "\"file", "2\""] 

Pour compliquer les choses De plus, mon objectif final est d'utiliser des substitutions variables dans la variable ARGS fournie, mais comment l'obtenir? Considérez ce qui suit:

FILENAME1="Picture 1.jpg" 
FILENAME2="Picture 2.jpg" 

ARGS="$FILENAME1 $FILENAME1" 

cp $ARGS 

Il en résulte quatre arguments:

execve("/bin/cp", ["cp", "Picture", "1.jpg", "Picture", "1.jpg"] 

Répondre

0

Vous ne pouvez pas utiliser de manière fiable un seul paramètre pour stocker une liste de valeurs; il n'existe aucun moyen de distinguer entre les espaces partie d'une valeur et les espaces séparent les valeurs. Utilisez un tableau à la place.

#!/bin/bash 

filename1="Picture 1.jpg" 
filename2="Picture 2.jpg" 

args=("$filename1" "$filename2") 

cp "${args[@]}" 
+0

Merci. Il s'avère que cela révèle une autre difficulté. Je dois utiliser cela pour traverser plusieurs scripts. Le seul paramètre contenant ma liste d'arguments est construit en un seul script et transmis au script qui exécutera une commande qui prend ces arguments. Comment passer un tableau au lieu d'un seul paramètre? –

+0

Vous ne pouvez pas; '" $ {args [@]} "' se développe simplement en une suite de mots individuels, chacun constituant un argument séparé. Vous devrez peut-être revoir l'interface entre les deux scripts. – chepner

+0

Okay. Merci pour la clarification. Je vais créer une autre question concernant ce problème alors :) –