在 bash 中,将变量传递给另一个程序最安全的方法是什么 - $* 或 $@?

在 bash 中,将变量传递给另一个程序最安全的方法是什么 - $* 或 $@?

有人可以简洁地向我解释这两个变量之间的区别吗?

将变量传递给另一个程序最安全的方法是什么?

例如

#! /bin/bash

# do stuff

# pass variables onto another program
java $@

答案1

使用这个脚本:

#! /bin/sh
# Greg Wooledge's args script
printf "%d args:" $#
printf " <%s>" "$@"
echo

试试这个演示:

$ 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>

您通常应该使用"$@"(带引号)。

有时更改IFS和使用很有用"$*"

$ saveIFS=$IFS; IFS='|'; args "$*"; IFS=$saveIFS
1 args: <a|b     c|d>

答案2

最安全的是"$@"因为它在不扩展的情况下传递 arglist 并分隔每个参数。看http://www.faqs.org/docs/abs/HTML/variables2.html#ARGLIST了解更多详情。

答案3

使用:"$@"如果您想准确地表示原始参数(包括无参数)。

有 5 个符号需要提及:

  • $@
  • $*
  • "$@"
  • "$*"
  • ${1+"$@"}

前两者是等价的;两者都分割参数列表中的单词并将它们传递给正在调用的命令。它们很少是正确的选择。

后两者完全不同。该"$@"表示法有效地将 shell 的参数(或通过命令设置的参数set)复制到正在调用的命令,保留参数的数量、参数中的空格以及参数之间的分隔。如果参数为零,则不会生成任何内容。

"$*"表示法将所有参数粘贴到单个字符串中,在参数之间放置一个空格,但保留参数内的空格。它适合在以下情况下使用:

echo "You said, '$*'"

其中对原始命令行的最大保真度并不重要。

最后的符号${1+"$@"}是过去几天遗留下来的,您可能会在旧的 shell 脚本中遇到。曾几何时(很久以前——比如 30 年前),"$@"当没有参数时,Bourne shell 将其视为单个空参数。这种行为已经很长时间没有出现了,但是一些很久以前编写的脚本可能仍然通过使用这种表示法来保护自己。该${1+X}符号的意思是“如果$1设置为任何内容,即使是空字符串,则提供值” X。在所讨论的符号中,Xis "$@",当已知至少有一个参数时,它是一个参数列表 - 否则没有参数。这与"$@"任何现代 shell 中的含义相同。

相关内容