有人可以简洁地向我解释这两个变量之间的区别是什么吗?
将变量传递给另一个程序的最安全方法是什么?
例如
#! /bin/bash
# do stuff
# pass variables onto another program
java $@
Run Code Online (Sandbox Code Playgroud)
Den*_*son 13
使用这个脚本:
#! /bin/sh
# Greg Wooledge's args script
printf "%d args:" $#
printf " <%s>" "$@"
echo
Run Code Online (Sandbox Code Playgroud)
试试这个演示:
$ set -- a 'b c' d
$ args $*
4 args: <a> <b> <c> <d>
$ args $@
4 args: <a> <b> <c> <d>
$ args "$*"
1 args: <a b c d>
$ args "$@"
3 args: <a> <b c> <d>
Run Code Online (Sandbox Code Playgroud)
您通常应该使用"$@"
(带引号)。
有时更改IFS
和使用很有用"$*"
:
$ saveIFS=$IFS; IFS='|'; args "$*"; IFS=$saveIFS
1 args: <a|b c|d>
Run Code Online (Sandbox Code Playgroud)
小智 5
最安全的是"$@"
因为它在没有扩展的情况下传递 arglist 并分隔每个参数。有关更多详细信息,请参阅http://www.faqs.org/docs/abs/HTML/variables2.html#ARGLIST。
用途:"$@"
如果要准确表示原始参数(包括无参数)。
有5个符号要提及:
$@
$*
"$@"
"$*"
${1+"$@"}
前两个是等价的;两者都拆分参数列表中的单词并将它们传递给正在调用的命令。他们很少是正确的选择。
后两者完全不同。该"$@"
符号有效地将 shell 的参数(或通过set
命令设置的参数)复制到被调用的命令,保留参数的数量、其中的空格以及它们之间的分割。如果有零个参数,则不会生成任何内容。
该"$*"
符号将所有参数粘贴到单个字符串中,在参数之间放置一个空格但保留参数内的空格。它适用于以下情况:
echo "You said, '$*'"
Run Code Online (Sandbox Code Playgroud)
其中对原始命令行的最大保真度并不重要。
最后一个符号 ,${1+"$@"}
是过去几天您可能在旧的 shell 脚本中遇到的残留物。曾几何时(很久以前 - 就像 30 年前),"$@"
当没有参数时,Bourne shell 被视为一个空参数。很长一段时间以来,这种行为都不是这种行为,但是很久以前编写的一些脚本可能仍然可以通过使用这种表示法来保护自己。该${1+X}
符号表示 'if$1
设置为任何内容,即使是空字符串,然后提供 value X
。在所讨论的符号中,X
is "$@"
,当已知至少有一个参数时,它是一个参数列表 - 否则没有参数。这与"$@"
任何现代 shell 中的含义相同。