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