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"]
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? –
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
Okay. Merci pour la clarification. Je vais créer une autre question concernant ce problème alors :) –