我正在尝试写一个脚本notify-finish
可以添加到任何命令的前面。完成后,它将运行以下参数给出的命令,然后在命令完成后向用户发送电子邮件。这是我所拥有的:
PROG=$1
# Run command given by arguments
$@
ECODE=$?
echo -e "Subject: `hostname`: $PROG finished\r\nTo: <$USER>\r\n\r\nExited with $ECODE\r\n" | sendmail $USER
这在大多数情况下都有效,但是当参数包含空格时,引号就会被去掉。
工作示例:
notify-finished rsync -avz source/ user@remote:dest/
失败示例:
notify-finished rsync -avz -e 'ssh -c blowfish' source/ user@remote:dest/
在第二种情况下,$@
扩展到rsync -avz -e ssh -c blowfish source user@remote:dest/
,缺少单引号。它不适用于双引号,也不适用于$*
.
阅读其他帖子后,我尝试将命令放入数组中,但我遇到了完全相同的问题:
CMD=(notify-finished rsync -avz -e 'ssh -c blowfish' source/ user@remote:dest/)
${CMD[@]}
我如何使这个适用于所有论点?
Use "$@"
with quotes:
prog="$1"
"$@"
ecode="$?"
echo "$prog exited with $ecode"
这将完全按照收到的情况传递每个参数。如果不包含引号,每个元素将根据$IFS
:
-
"$@"
就好像"$1" "$2" "$3" ...
,将每个元素作为单独的参数传递。
-
"$*"
就好像"$1 $2 $3 ..."
,将所有串联的元素作为单个参数传递
-
$*
and $@
就好像$1 $2 $3 ...
,在空格上分解每个元素,展开所有的全局对象,并将每个结果单词作为单独的元素传递($IFS
).
对于数组也是如此,比如"${array[@]}"
and "${array[*]}"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)