bash: appeler un script avec un argument double-quote

j'ai des scripts bash qu'un argument enfermé avec des guillemets doubles, qui crée un fichier de forme de map dans les limites données, par exemple

$ export_map "0 0 100 100"

dans le script, il y a deux select déclarations:

select ENCODING in UTF8 WIN1252 WIN1255 ISO-8859-8;
...
select NAV_SELECT in Included Excluded;

naturellement, ces deux énoncés nécessitent l'entrée d'un nombre comme une entrée. Cela peut être contourné en passant par les nombres, suivi d'une nouvelle ligne, au script.

In pour gagner du temps, j'aimerais avoir un script qui créerait 8 maps - pour chaque combinaison de ENCODING (4 options) et NAV_SELECT (2 options).

j'ai écrit un autre script bash, create_map , au serveur comme un wrapper:

#!/bin/bash

for nav in 1 2 3 4;
do
    for enc in 1 2;
    do
        printf "$navn$encn" | /bin/bash -c "./export_map.sh "0 0 100 100"" 
    done
done

**Cela fonctionne (merci, Brian !), mais je ne peux pas trouver un moyen d'avoir l'argument numérique "0 0 100 100" passé de l'extérieur du script externe. **

en gros, je cherche un moyen d'accepter un argument entre guillemets à un script wrapper bash, et de le passer - avec les guillemets - à un script interne.

CLARIFICATIONS:

export_map est le script principal, étant appelé de create_map 8 fois.

des idées?

Merci,

Adam

0
demandé sur Community 2010-01-03 16:18:11

1 réponses

si je comprends votre problème correctement (ce dont je ne suis pas sûr; voir mon commentaire), vous devriez probablement ajouter un autre \n à votre printf ; printf n'ajoute pas de nouvelle ligne par défaut comme echo le fait. Cela assurera que la seconde valeur sera lue correctement par la commande select qui, je suppose, apparaît dans export_map.sh .

printf "$nav\n$enc\n" | /bin/bash -c "./export_map.sh \"100 200 300 400\""

Aussi, je ne pense pas que vous devez ajouter le /bin/bash -c et les guillemets. Ce qui suit devrait suffire, à moins que je ne manque quelque chose:

printf "$nav\n$enc\n" | ./export_map.sh "100 200 300 400"

modifier Merci pour la clarification. Afin de passer un argument à partir de votre script dans le script interne, en gardant comme seul argument, vous pouvez passer en "" , où les guillemets indiquent que vous souhaitez conserver cette regroupés en un seul argument, et est le premier paramètre à votre script. Si vous souhaitez passer tous les paramètres de votre script externe dans votre script interne, chacun étant gardé comme un seul paramètre, vous pouvez utiliser "$@" à la place.

#!/bin/bash

for nav in 1 2 3 4;
do
    for enc in 1 2;
    do
        printf "$nav\n$enc\n" | ./export_map.sh ""
    done
done

voici un exemple rapide du fonctionnement de "$@" . D'abord, inner.bash :

#!/bin/bash

for str in "$@"
do
    echo $str
done

outer.bash :

#!/bin/bash

./inner.bash "$@"

et l'invoquer:

$ ./outer.bash "foo bar" baz "quux zot"
foo bar
baz
quux zot
6
répondu Brian Campbell 2010-01-03 15:19:36