2017-04-06 125 views
1

我很感興趣的是在bash腳本中使用動態生成的參數調用某些函數。在bash中使用空格傳遞參數

但是,如果某些參數有空格,它似乎不起作用。

讓我們有這樣的測試腳本:

#!/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 

我的任何腳本:

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

當調用bash vv.sh "a b"我得到以下結果:

$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 

我期待的方式將變量傳遞給uu.sh,例如結果如下:

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

(我可以通過調用bash uu.sh -x a\ b直接獲得,或bash uu.sh -x "a b",或bash uu.sh -x 'a b'

+0

你想要''$ 1「'而不是'$ 1'。你也可以使用'「$ @」'作爲所有參數。 – jm666

+0

問題不在'uu.sh'中(以及任何如何使用引號測試,而且我仍然看到相同的問題) –

回答

3

你應該有vv.sh這樣才能夠在第二個參數-x後,所有的參數傳遞給uu.sh

#!/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 [@] 

然後把它作爲(見報價參數):

bash vv.sh "a b" 

...這將發出作爲輸出:

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

I' m不感興趣從'vv.sh'傳遞所有參數,只是第一個參數(或者只是第三個或其他變量) –

+0

ok查看更新的答案。 – anubhava

+1

然而,@(和引號)做到了! 'bash uu.sh「$ {ARR [@]}」' –

3

這裏是$*[email protected]也,你應該總是引用變量(除非你知道爲什麼不想)之間的差異:)

#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" 

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[@]}" 

輸出:

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[*]}""$*"膨脹到單個字與陣列成員或用空格接合位置參數。這幾乎沒有用處。相反,使用"${array[@]}""[email protected]",這會擴展所有陣列成員以分隔單詞。 (見ArraysSpecial parameters手冊中。)

所以當你做bash uu.sh "${ARR[*]}"命令傳遞一個字符串作爲參數,並與bash uu.sh ${ARR[*]}沒有報價,因此陣列get split on whitespace的所有內容。