将带有空格的参数 $* 传递给第二个脚本

将带有空格的参数 $* 传递给第二个脚本

我有一个带有可变数量参数的脚本。我还有一个包装器脚本,我在其中采用相同的参数并添加更多参数。问题是,当我的参数带有空格时,它们在传递到“内部”脚本时会被单词分割。

例如外部脚本:

# 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和实际日期字符串连接为单个参数。

知道该怎么做吗?

答案1

使用"$@"

./tst2.sh "$@" --some --more --params

$*和之间的区别在于"$@",这$*将是单串由所有位置参数的串联组成,第一个字符为$IFS分隔符(该字符串将另外进行分词和文件名扩展,因为它不带引号),而"$@"(注意双引号!)将是每个位置参数单独引用

当想要保留各个位置参数时,请始终使用"$@"

当想要在第一个字符上加入位置参数来$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

相关内容