gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:44:03 25 4
gpt4 key购买 nike

我正在尝试编写一个脚本 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[@]}

我如何使它适用于所有参数?

最佳答案

使用 "$@" 引号:

prog="$1"
"$@"
ecode="$?"
echo "$prog exited with $ecode"

这将完全按照收到的方式传递每个参数。如果不包括引号,每个元素将根据 $IFS 拆分:

  • "$@" 类似于 "$1""$2""$3"...,将每个元素作为单独的参数传递。
  • "$*" 类似于 "$1 $2 $3 ...",将所有连接的元素作为单个参数传递
  • $*$@ 就像 $1 $2 $3 ...,在空白处分解每个元素,展开所有 glob,并且将每个结果单词作为单独的元素传递 ($IFS)。

数组也是如此,比如"${array[@]}""${array[*]}"

关于bash - 如何传递包含引号/空格的脚本参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5720194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com