我正在尝试修改一个没有很好记录的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=$?
}
答案 0 :(得分:3)
$*
表示所有参数,但传递它们的方法是错误的,因为如果不加引号(如此处),它将在空格上拆分它们,或者如果引用则将它们组合成单个参数。最好使用"$@"
,它会以空白安全的方式传递它们。
答案 1 :(得分:1)
$*
和$@
都与shell的所有参数相关,但它们做了不同的事情。
当不加引号时,$*
和$@
会做同样的事情。他们将每个单词(非空白的序列)视为一个单独的参数。
当引用时,它们完全不同。 "$*"
将参数列表视为单个空格分隔的字符串,而"$@"
几乎完全按照在命令行中指定的参数处理参数。