Bash

將帶有空格的參數的 $* 傳遞給第二個腳本

  • March 3, 2021

我有一個帶有可變數量參數的腳本。我還有一個包裝腳本,我在其中採用相同的參數並添加更多參數。問題是,當我有帶空格的參數時,它們在傳遞給“內部”腳本時會被單詞分割。

例如外部腳本:

# 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

$*和之間的區別在於"$@"$*它將是一個字元串,由所有位置參數與$IFSas 分隔符的第一個字元的串聯組成(此字元串將另外進行分詞和文件名擴展,因為它沒有被引用),而"$@"(注意雙引號!) 將被單獨引用的每個位置參數。

如果要保留各個位置參數,請始終使用"$@".

當想要在第一個字元上加入位置參數$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

引用自:https://unix.stackexchange.com/questions/496770