2010-01-03 7 views
0

J'ai un script bash dont un argument est entouré de guillemets, ce qui crée un fichier de forme de carte dans les limites données, par ex.bash: appel d'un script avec un argument de guillemets

$ export_map "0 0 100 100" 

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

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

Bien entendu, ces deux déclarations l'entrée exigent entrer un numéro comme entrée. Cela peut être contourné en redirigeant les numéros, suivis d'une nouvelle ligne, vers le script.

Afin de gagner du temps, je voudrais avoir un script qui créerait 8 cartes - pour chaque combinaison de ENCODING (4 options) et NAV_SELECT (2 options).

J'ai écrit un autre script bash, create_map, au serveur comme emballage: (merci!, Brian)

#!/bin/bash 

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

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

Fondamentalement, je suis à la recherche d'un moyen d'accepter un argument entre guillemets doubles à un script bash wrapper, et le passer - avec les guillemets doubles - à un script interne.

PRÉCISIONS:

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

Des idées?

Merci,

Adam

+0

Je suis un peu clair sur ce que vous essayez de faire ici. Vous dites que vous essayez de faire quelque chose avec des instructions 'select', mais il n'y a pas d'instruction select dans votre script bash. Vous imprimez deux nombres sur des lignes différentes et redirigez-les dans une invocation de votre script 'export_map.sh', pour lequel vous ne fournissez pas le code (est-ce le même que le' create_map' que vous avez mentionné plus tôt?). Je ne sais pas trop où vos problèmes de citations arrivent aussi. Pouvez-vous essayer de préciser ce que vous essayez exactement de faire, et le problème exact que vous rencontrez? –

+0

J'ai clarifié ma réponse - merci beaucoup. –

Répondre

6

Si je comprends bien votre problème (que je ne suis pas sûr, voir mon commentaire), vous devriez probablement ajouter une autre \n à votre printf; printf n'ajoute pas de retour à la ligne par défaut comme le fait echo. Cela assurera que la deuxième valeur sera lue correctement par la commande select que je suppose assumée 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 les marques /bin/bash -c et devis. Ce qui suit devrait être suffisant, à moins que je me 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 de votre script wrapper, dans le script interne, en le gardant comme un seul argument, vous pouvez passer en "$1", où les guillemets indiquent que vous voulez garder ce groupé comme un argument, et $1 est le premier paramètre à votre script d'emballage. Si vous souhaitez transmettre tous les paramètres de votre script externe à votre script interne, chacun étant conservé en tant que paramètre unique, vous pouvez utiliser "[email protected]" à 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 "$1" 
    done 
done 

Voici un exemple rapide du fonctionnement de "[email protected]". Tout d'abord, inner.bash:

#!/bin/bash 

for str in "[email protected]" 
do 
    echo $str 
done 

outer.bash:

#!/bin/bash 

./inner.bash "[email protected]" 

Et invoquant:

$ ./outer.bash "foo bar" baz "quux zot" 
foo bar 
baz 
quux zot 
+0

+1 Bonne réponse. Aussi vraiment aimé votre défi d'encodage d'image Twitter. –

+0

Merci! J'ai passé beaucoup de temps et d'effort sur ce défi ... mais c'était très amusant. –

Questions connexes