$ *做什么

时间:2014-04-04 03:38:49

标签: bash shell

我正在尝试修改一个没有很好记录的shell脚本。我知道基础知识,但这个片段令人困惑。

我不确定这行是做什么的:

time java -showversion -jar ${here_dir}/AESampleTool.jar -f $FILES -d ${output_dir} $*

我不知道$ *是什么。谷歌没有多少。上面的行是否设置$ *等于之前的值?脚本中的下一行是$ *作为参数传递给名为launch的函数:

launch $* 1>$log_file 2>&1

以下是该功能。奇怪的部分似乎是一个循环引用。函数内部设置$ *但是然后将其作为参数传递给函数本身。

function launch {
hset -x
USER=$AEX_USER
l_output_dir=$output_dir
l_here_dir=$here_dir
l_LOGFILE=$LOGFILE
l_FILES=$FILES
l_EXE_JAR=$EXE_SH
l_AEX_LOGDIR=$AEX_LOGDIR
l_AEX_LOGNAME=$AEX_LOGNAME
time java -showversion -jar ${here_dir}/AESampleTool.jar -f $FILES -d ${output_dir} $*
rc=$?
}

2 个答案:

答案 0 :(得分:3)

$*表示所有参数,但传递它们的方法是错误的,因为如果不加引号(如此处),它将在空格上拆分它们,或者如果引用则将它们组合成单个参数。最好使用"$@",它会以空白安全的方式传递它们。

答案 1 :(得分:1)

$*$@都与shell的所有参数相关,但它们做了不同的事情。

不加引号时,$*$@会做同样的事情。他们将每个单词(非空白的序列)视为一个单独的参数。

引用时,它们完全不同。 "$*"将参数列表视为单个空格分隔的字符串,而"$@"几乎完全按照在命令行中指定的参数处理参数。