Bash
將帶有空格的參數的 $* 傳遞給第二個腳本
我有一個帶有可變數量參數的腳本。我還有一個包裝腳本,我在其中採用相同的參數並添加更多參數。問題是,當我有帶空格的參數時,它們在傳遞給“內部”腳本時會被單詞分割。
例如外部腳本:
# tst1.sh echo "-- tst1.sh --" echo "1: $1" echo "2: $2" ./tst2.sh $* --some --more --params
和內部腳本:
#!/bin/bash echo "-- tst2.sh --" echo "1: $1" echo "2: $2"
現在,當我呼叫包裝腳本時,它會將日期作為單個參數正確獲取,但是內部僅獲取第一個單詞:
$ ./tst1.sh --date "$(date)" -- tst1.sh -- 1: --date 2: Fri Jan 25 21:51:57 GMT 2019 -- tst2.sh -- 1: --date 2: Fri <== this is wrong
我希望第二個腳本的輸出與第一個腳本相同。所有這些對於可變數量的參數,這就是我使用而不是我可以引用的
$*
個人$1
,等的原因。$2
我嘗試引用
"$*"
,但隨後將--date
實際日期字元串作為單個參數加入。知道怎麼做嗎?
使用
"$@"
:./tst2.sh "$@" --some --more --params
$*
和之間的區別在於"$@"
,$*
它將是一個字元串,由所有位置參數與$IFS
as 分隔符的第一個字元的串聯組成(此字元串將另外進行分詞和文件名擴展,因為它沒有被引用),而"$@"
(注意雙引號!) 將被單獨引用的每個位置參數。如果要保留各個位置參數,請始終使用
"$@"
.當想要在第一個字元上加入位置參數
$IFS
以創建單個字元串時,請使用"$*"
. 除了在某些情況下創建文本字元串時,它很少使用。
$*
使用或不引用幾乎沒有意義$@
。
"$@"
vs.的簡短範例"$*"
:set -- "bumblebee 1" "bumblebee 2" IFS=, printf 'With "$@": %s\n' "$@" printf 'With "$*": %s\n' "$*"
輸出(添加註釋)
With "$@": bumblebee 1 <-- "$1" here With "$@": bumblebee 2 <-- "$2" here With "$*": bumblebee 1,bumblebee 2 <-- "$1$IFS$2" here