簡體   English   中英

通過bash中的列表傳遞帶有空格的參數

[英]Passing arguments with spaces via list in 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 "ab"我得到以下結果:

$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 -xa\\ bbash uu.sh -x "ab"bash uu.sh -x 'a b'可以直接獲得它)

您應該具有這樣的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

這是$*$@之間的區別,而且,您應始終引用變量(除非您知道為什么不想要):)

#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

"${array[*]}""$*"擴展為一個單詞 ,其中數組成員或位置參數與空格連接。 那幾乎是沒有用的。 而是使用"${array[@]}""$@" ,它們將所有數組成員擴展為單獨的單詞。 (請參見手冊中的數組特殊參數 。)

因此,當您執行bash uu.sh "${ARR[*]}" ,命令將傳遞一個字符串作為參數,並且使用bash uu.sh ${ARR[*]}沒有引號,因此數組的所有內容都將得到在空白處分割

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM