Kee*_*ing 1 bash shell-script bash-expansion
我有一个脚本,它采用可变数量的参数。我还有一个包装脚本,我在其中使用相同的参数并添加更多参数。问题是,当我有带有空格的参数时,它们在传递给“内部”脚本时会被单词分割。
例如外部脚本:
# tst1.sh
echo "-- tst1.sh --"
echo "1: $1"
echo "2: $2"
./tst2.sh $* --some --more --params
Run Code Online (Sandbox Code Playgroud)
和内部脚本:
#!/bin/bash
echo "-- tst2.sh --"
echo "1: $1"
echo "2: $2"
Run Code Online (Sandbox Code Playgroud)
现在,当我调用包装器脚本时,它会将日期作为单个参数正确获取,但是内部只获取第一个单词:
$ ./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
Run Code Online (Sandbox Code Playgroud)
我希望第二个脚本的输出与第一个相同。和所有的可变数量的参数,这就是为什么我用$*
,而不是单独的$1
,$2
等我能引用。
我尝试引用,"$*"
但随后将--date
日期字符串和实际日期字符串作为单个参数连接起来。
知道怎么做吗?
Kus*_*nda 10
使用"$@"
:
./tst2.sh "$@" --some --more --params
Run Code Online (Sandbox Code Playgroud)
$*
和之间的区别在于"$@"
,$*
它将是一个由所有位置参数与作为分隔符的第一个字符连接而成的单个字符串$IFS
(该字符串将另外进行分词和文件名扩展,因为它没有被引用),而"$@"
(注意双引号!) 将单独引用每个位置参数。
当想要保留单个位置参数时,请始终使用"$@"
.
当想要在 的第一个字符上加入位置参数$IFS
以创建单个字符串时,请使用"$*"
. 除了在某些情况下创建文本字符串时,这很少使用。
使用$*
或不加$@
引号很少有意义。
"$@"
vs. 的简短示例"$*"
:
set -- "bumblebee 1" "bumblebee 2"
IFS=,
printf 'With "$@": %s\n' "$@"
printf 'With "$*": %s\n' "$*"
Run Code Online (Sandbox Code Playgroud)
输出(添加注释)
With "$@": bumblebee 1 <-- "$1" here
With "$@": bumblebee 2 <-- "$2" here
With "$*": bumblebee 1,bumblebee 2 <-- "$1$IFS$2" here
Run Code Online (Sandbox Code Playgroud)