2017-05-29 1 views
1

Comment faire passer la fonction 3 arguments au lieu de quatre? La citation d'arguments dans un script de corps ne m'aide pas. Exemple script corps de test.sh:Repasser des arguments BASH avec des guillemets dans la fonction

func1(){ 
    echo "Func1: Amount arguments: $#, Passed arguments: [email protected]"; 
    for i in [email protected]; do 
     echo "ARG=$i"; 
    done; 
} 

echo "Body: Amount arguments: $#, Passed arguments: [email protected]"; 
func1 [email protected]; 

# quoting with single or double quote 
res=""; 
for i in "${@}"; do 
    # try to figure out if quoting was required for the $i: 
    grep -q "[[:space:]]" <<< "$i" && res="${res} \"${i}\"" || res="${res} ${i}"; 
done; 

echo "Quoted arguments: $res"; 
func1 $res; 

i exécution du script avec les arguments suivants:

bash ./test.sh 1 2 "3 4" 

Résultat:

Body: Amount arguments: 3, Passed arguments: 1 2 3 4 
Func1: Amount arguments: 4, Passed arguments: 1 2 3 4 
ARG=1 
ARG=2 
ARG=3 
ARG=4 
Quoted arguments: 1 2 "3 4" 
Func1: Amount arguments: 4, Passed arguments: 1 2 "3 4" 
ARG=1 
ARG=2 
ARG="3 
ARG=4" 

Je veux obtenir le troisième argument que "3 4" . Comment faire? Je vous remercie.

Répondre

0

Vous devez citer les arguments l'appel à la fonction func1 et sur la boucle à l'intérieur de cette fonction afin que la variable d'extension ne supprime pas les guillemets de vos arguments.

#!/bin/bash 

func1(){ 
echo "Func1: Amount arguments: $#, Passed arguments: [email protected]" 
for i in "[email protected]"; do                                                      
    echo "ARG=$i" 
done 
} 

echo "Body: Amount arguments: $#, Passed arguments: [email protected]" 
func1 "[email protected]" 

Notez que j'ai enlevé le ; et la fin de chaque ligne car ils ne sont pas nécessaires.

+0

Hmmm ... Cela fonctionne vraiment, si citation - "$ @". C'est la meilleure solution pour moi, il n'y a pas besoin de code supplémentaire. C'est étrange, mais plus tôt j'ai essayé de le faire et je n'ai pas réussi, mais maintenant j'ai vérifié que tout fonctionne bien. Je vous remercie! – dva

+0

Bien que les autres solutions soient plus génériques pour les fonctions imbriquées, cela devrait suffire pour votre code. Remarquez aussi les guillemets sur la boucle 'for' (ceux que vous avez probablement oubliés lors des tentatives précédentes). –

+0

S'il vous plaît envisager [en acceptant la réponse] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) si c'était utile. –

0

Si vous souhaitez générer une liste d'arguments nécessitant une citation, vous devez utiliser un tableau. Les citations syntaxiques ne nichent pas; Les guillemets internes sont traités comme des caractères littéraux lorsque vous développez le paramètre.

res=() 
for i in "${@}"; do 
    res+=("$i") 
done 

func "${res[@]}" 

(ci-dessus est équivalent, bien sûr, à res=("[email protected]") si vous ne faites rien d'autre avec la valeur de i sauf l'ajouter au tableau.)

+0

Merci, cela fonctionne – dva