Bash $@和$*
我已经编写了一个简单的脚本,它接受了任意数量的参数来演示Bash $@和$*,bash,parameters,command-line-interface,Bash,Parameters,Command Line Interface,我已经编写了一个简单的脚本,它接受了任意数量的参数来演示$@和$*之间的区别: #!/bin/bash echo "double quoted $* $@" echo 'single quoted $* $@' 在CLI上,我这样做了 $./stuff.sh a b c d e f dfs 这是打印出来的 double quoted a b c d
$@
和$*
之间的区别:
#!/bin/bash
echo "double quoted $* $@"
echo 'single quoted $* $@'
在CLI上,我这样做了
$./stuff.sh a b c d e f dfs
这是打印出来的
double quoted a b c d e f dfs a b c d e f dfs
single quoted $* $@
由于它们是相同的,这是否意味着$@
等于$*
?还是我遗漏了一点?来自
*
展开到位置参数,从一开始。当
展开发生在双引号内,它展开为单个单词
每个参数的值由
IFS特殊变量。也就是说,“$*”相当于“$1c$2c…”,
其中c是IFS变量值的第一个字符。如果
如果未设置,则参数用空格分隔。如果IFS为空,
这些参数是在不插入分隔符的情况下合并的
@
展开到位置参数,从一开始。当
展开发生在双引号内,每个参数展开为
单独的词。也就是说,“$@”相当于“$1”$2”…。如果
双引号展开发生在一个单词中,即
第一个参数与原始参数的开始部分连接
word,最后一个参数的展开式与最后一个参数联接
原词的一部分。如果没有位置参数,
“$@”和“$@展开为零(即,它们被删除)
最好举个例子:
$ d=(a b c)
$ for i in "${d[*]}"; do echo $i; done <---- it is a field all together
a b c
$ for i in "${d[@]}"; do echo $i; done <---- each item is a different field
a
b
c
$d=(a b c)
“${d[*]}”中i的$;不要重复$i;完成来自:
$*存储在命令行中输入的所有参数
所以
“$@”存储在命令行中输入的所有参数,并单独引用
所以
请看,,。正确的信息,但引用回一个非常糟糕的来源。(在《bash》中,一个经常让人烦恼的事情就是帮助人们忘记ABS教他们写的bug)。确切地说,我只是想找一个更好的参考书。更新:)$1$2…
仅在默认的IFS
值下为真。如果您设置了IFS=:
,那么它将变成$1:$2:…
f/e。您能提供一个$@
(不带双引号)的示例吗?你的例子帮助我快速理解它们的区别。如果不加引号使用,$@
与不加引号的$*
完全相同。我很乐意为这一点添加一个例子。
$1 $2 ...
"$1" "$2" ...
$ set -- "hello world" foo bar
$ printf '<%s> ' "$@"; echo
<hello world> <foo> <bar> # "$@" keeps original separation
$ printf '<%s> ' "$*"; echo
<hello world foo bar> # "$*" combines everything into one string
$ printf '<%s> ' $*; echo
<hello> <world> <foo> <bar> # $* (no quotes) loses delimitation entirely.
$ printf '<%s> ' $@; echo
<hello> <world> <foo> <bar> # unquoted, $@ is identical to unquoted $*.
jars=( *.jar )
IFS=:
export CLASSPATH=${jars[*]}