2017-04-06 6 views
1

Ich bin interessant beim Aufruf einer Funktion mit dynamisch generierten Argumenten in einem Bash-Skript.Übergabe von Argumenten mit Leerzeichen über eine Liste in bash

Wenn jedoch einige der Argumente Leerzeichen hatten, scheint es nicht zu funktionieren.

Lassen Sie uns dieses Testskript haben:

#!/bin/bash 
# file uu.sh 
[[ -z $1 ]] || echo '$1' $1 
[[ -z $2 ]] || echo '$2' $2 
[[ -z $3 ]] || echo '$3' $3 
[[ -z $4 ]] || echo '$4' $4 
[[ -z $5 ]] || echo '$5' $5 
[[ -z $6 ]] || echo '$6' $6 
[[ -z $7 ]] || echo '$7' $7 
[[ -z $8 ]] || echo '$8' $8 
[[ -z $9 ]] || echo '$9' $9 
[[ -z $0 ]] || echo '$0' $0 

Jede mein Skript:

#!/bin/bash 
# file vv.sh 
ARR=(-x) 
ARR+=($1) 
ARR+=("$1") 
ARR+=("'$1'") 
ARR+=("\"$1\"") 
bash uu.sh ${ARR[*]} 
echo 
bash uu.sh "${ARR[*]}" 

Beim Aufruf bash vv.sh "a b" ich folgendes Ergebnis:

$2 -x 
$2 a 
$3 b 
$4 a 
$5 b 
$6 'a 
$7 b' 
$8 "a 
$9 b" 
$0 uu.sh 

$1 -x a b a b 'a b' "a b" 
$0 uu.sh 

Ich erwarte einen Weg übergeben Sie die Variablen an uu.sh wie das Ergebnis wäre:

$1 -x 
$2 a b 
$0 uu.sh 

(Was ich direkt bash uu.sh -x a\ b durch den Aufruf bekommen, oder bash uu.sh -x "a b" oder bash uu.sh -x 'a b')

+0

Sie wollen '" $ 1 "' und nicht '$ 1'. Sie könnten auch '$ @' 'für alle Argumente verwenden. – jm666

+0

Das Problem ist nicht in' uu.sh' (und, wie auch immer, ich habe mit den Anführungszeichen getestet, und ich sehe immer noch das gleiche Problem) –

Antwort

3

Sie vv.sh wie diese in der Lage sein sollten, alle Argumente nach -x im 2. Argument uu.sh weitergeben müssen:

#!/bin/bash 
# file vv.sh 
ARR=(-x) # initialize array with "-x" as first element 
ARR+=("$1") # append 1st argument in second element of array 
bash uu.sh "${ARR[@]}" # call uu.sh with quoted and [@] 

verwenden sie dann als (zitiert Argumente sehen):

bash vv.sh "a b" 

..., die als Ausgangs emittieren:

$1 -x 
$2 a b 
$0 uu.sh 
+0

I ' Ich bin nicht daran interessiert, alle Argumente von 'vv.sh' zu übergeben, nur das erste Argument (oder nur die dritte oder eine andere Variable) –

+0

ok Prüfe aktualisierte Antwort. – anubhava

+1

Allerdings hat das @ (und die Anführungszeichen) den Trick gemacht! 'bash uu.sh" $ {ARR [@]} "' –

3

Hier ist ein Unterschied zwischen $* und [email protected] und auch sollten Sie immer die Variablen zitieren (es sei denn, Sie wissen, warum nicht wollen) :)

#uu.sh 
[[ -z "$1" ]] || echo '$1' "$1" 
[[ -z "$2" ]] || echo '$2' "$2" 
[[ -z "$3" ]] || echo '$3' "$3" 
[[ -z "$4" ]] || echo '$4' "$4" 
[[ -z "$5" ]] || echo '$5' "$5" 
[[ -z "$6" ]] || echo '$6' "$6" 
[[ -z "$7" ]] || echo '$7' "$7" 
[[ -z "$8" ]] || echo '$8' "$8" 
[[ -z "$9" ]] || echo '$9' "$9" 
[[ -z "$0" ]] || echo '$0' "$0" 

und der vv.sh

ARR=(-x) 
ARR+=($1) 
ARR+=("$1") 
ARR+=("'$1'") 
ARR+=("\"$1\"") 

echo 'using quoted ARR[@]' 
printf "=%s=\n" "${ARR[@]}" 

echo 'using unquoted ARR[@]' 
printf "=%s=\n" ${ARR[@]} 

echo 'using quoted ARR[*]' 
printf "=%s=\n" "${ARR[*]}" 

echo 'using unquoted ARR[*]' 
printf "=%s=\n" ${ARR[*]} 

echo "running UU" 
bash uu.sh "${ARR[@]}" 

output:

using quoted ARR[@] 
=-x= 
=A= 
=B= 
=A B= 
='A B'= 
="A B"= 
using unquoted ARR[@] 
=-x= 
=A= 
=B= 
=A= 
=B= 
='A= 
=B'= 
="A= 
=B"= 
using quoted ARR[*] 
=-x A B A B 'A B' "A B"= 
using unquoted ARR[*] 
=-x= 
=A= 
=B= 
=A= 
=B= 
='A= 
=B'= 
="A= 
=B"= 
running UU 
$1 -x 
$2 A 
$3 B 
$4 A B 
$5 'A B' 
$6 "A B" 
$0 uu.sh 
3

"${array[*]}" und "$*" zu einem einzigen Wort mit den Arrayelementen oder Positionsparameter mit Räumen verbunden erweitern. Das ist fast nie nützlich. Verwenden Sie stattdessen "${array[@]}" oder "[email protected]", die alle Array-Elemente auf separate Wörter erweitern. (Siehe Arrays und Special parameters im Handbuch.)

Also, wenn Sie tun bash uu.sh "${ARR[*]}" der Befehl eine Zeichenkette als Parameter übergeben wird, und mit bash uu.sh ${ARR[*]} gibt es keine Anführungszeichen, so dass alle Inhalte des Arrays get split on whitespace.

Verwandte Themen