如何传递包含引号/空格的脚本参数?

| 我正在尝试编写脚本
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/
在第二种情况下,“ 4”扩展为“ 5”,缺少单引号。它不能与双引号一起使用,也不能与
$*
一起使用。 阅读其他文章后,我尝试将命令放入数组中,但出现了完全相同的问题:
CMD=(notify-finished rsync -avz -e \'ssh -c blowfish\' source/ user@remote:dest/)
${CMD[@]}
我该如何处理所有论点?     
已邀请:
\"$@\"
引号:
prog=\"$1\"
\"$@\"
ecode=\"$?\"
echo \"$prog exited with $ecode\"
这将完全按照接收的参数传递每个参数。如果您不包括引号,则会根据will10ѭ拆分每个元素:
\"$@\"
就像
\"$1\" \"$2\" \"$3\" ...
,将每个元素作为单独的参数传递。
\"$*\"
就像
\"$1 $2 $3 ...\"
,将所有串联的元素作为单个参数传递
$*
$@
类似于
$1 $2 $3 ...
,将空白处的每个元素分解,扩展所有glob,并将每个结果单词作为单独的元素传递(
$IFS
)。 数组也是如此,例如
\"${array[@]}\"
\"${array[*]}\"
    
用双引号引起来的变量替换不被解析(请注意,这适用于所有变量:
$@
$1
$PROG
)。另外:分配变量时,不要在变量名前加上$;用
#
发表评论;并且在最后一行,单引号将完全防止变量被替换。
PROG=\"$1\"
shift
# Run program below
\"$PROG\" \"$@\"
ECODE=$? # note: this will always be a number, so it doesn\'t have to be protected with double-quotes
echo -e \"Subject: $(hostname): $PROG finished\\r\\nTo: <$USER>\\r\\n\\r\\nExited with $ECODE\\r\\n\' | sendmail \"$USER\"
    

要回复问题请先登录注册