【发布时间】:2015-07-16 22:49:13
【问题描述】:
来自 bash 手册页:
"$*"等价于"$1c$2c...",其中c是IFS变量值的第一个字符。
"$@"等价于"$1" "$2"...
"$@" 不能代替 "$*" 的任何示例?
【问题讨论】:
标签: bash parameters arguments command-line-arguments
来自 bash 手册页:
"$*"等价于"$1c$2c...",其中c是IFS变量值的第一个字符。
"$@"等价于"$1" "$2"...
"$@" 不能代替 "$*" 的任何示例?
【问题讨论】:
标签: bash parameters arguments command-line-arguments
我最喜欢的用途是替换字段分隔符。
$ set -- 'My word' but this is a bad 'example!'
$ IFS=,
$ echo "$*"
My word,but,this,is,a,bad,example!
还有其他方法可以替换分隔符,但 IFS 和 "$*" 通常是最简单的方法之一。
【讨论】:
printf -v output '%s,' "$@" 来完成相同的任务,但是会留下一个尾随的 , 需要被剥离(虽然 output=${output%,} 做的很短,但这并不完全漂亮)。
这些是完全不同的工具,应该在完全不同的情况下使用。用一个代替另一个是没有合理的问题的,因为在任何给定的情况下,只有一个或另一个是正确的。
"$*" 最适用于您尝试从参数列表中形成单个字符串参数 - 主要用于日志记录(但不是参数之间的划分很重要的情况;然后,"$@" 适合类似print '%q ')。 "$@" 在......好吧,任何其他情况下都很有用。
例子:
die() {
local stat=$1; shift
log "ERROR: $*"
exit $stat
}
在格式化要传递给log 的字符串时使用"$*" 仅使用一个argv 条目,从而允许将来将其他可选位置参数添加到log 的使用中。
【讨论】:
$* 将所有参数扩展为一个单词,参数之间带有 IFS。
$@ 以列表的形式扩展到所有参数。
在名为 list.sh 的文件中尝试下一个代码:
#!/bin/bash
echo "using '$*'"
for i in "$*"
do
echo $i
done
echo "using '$@'"
for i in "$@"
do
echo $i
done
使用它:
./list.sh apple pear kiwi
【讨论】:
$@ 的可用性,$* 的实际用途是什么。
echo "$i" 会比echo $i 更好;否则,glob 会被扩展,空格的运行会被压缩,等等;可以通过使用 @ 来做出额外的改进987654327@ 代替,这将更正使用 -n 等参数的处理,否则 echo 会消耗自身)。