【问题标题】:Shell embed variable with spaces inside the string of commands [duplicate]Shell在命令字符串中嵌入带有空格的变量[重复]
【发布时间】:2017-03-06 14:17:49
【问题描述】:

这个例子是基于 swaks 的,但它不是我使用的唯一一个解决这个问题的程序 :)

我有一个变量SUBJECT="test subject"

然后我将命令附加到一个字符串:

SWAKS="
     -t $TO
     -h-From $FROM
     --header Subject:$SUBJECT
     --body $BODY
     --auth
     --auth-user=user@domain.com
     --auth-password=d83kflb827Ms7d"

然后我以./swaks $SWAKS 执行它

但是邮件的主题是test,因为空格后面的所有内容都被忽略了。

我尝试将引号更改为单个引号,添加 baslashes,但没有任何效果。我做错了什么?

我最近的尝试看起来像这样(stderr 的输出):

./swaks -t '$TO' '\' -h-From '"test' subject"'

这是在开头和结尾使用单引号并在每个变量周围使用双引号。

【问题讨论】:

标签: bash shell


【解决方案1】:

这就是bash 提供数组的原因。

SWAKS=(
     -t "$TO"
     -h-From "$FROM"
     --header "Subject:$SUBJECT"
     --body "$BODY"
     --auth
     --auth-user=user@domain.com
     --auth-password=d83kflb827Ms7d
)

# Appending additional arguments to the array in a loop
for f in attachments/*; do
    # Same as SWAKS=( "${SWAKS[@]}" --attach "$f" )
    SWAKS+=( --attach "$f" )
done

./swaks "${SWAKS[@]}"

【讨论】:

  • 我可以使用“for”循环将参数附加到数组吗?
  • 确实;您可以使用+= 运算符附加到数组:SWAKS+=( --another-option "and it's argument" )
  • 我将它与 for 循环一起使用,它就像一个魅力,是时候阅读更多关于这些数组的信息了
【解决方案2】:

恕我直言,将所有命令行参数保存在一个变量中并不是一个好主意。我宁愿这样:

./swaks                            \
    -t "$TO"                       \
    -h-From "$FROM"                \
    --header Subject:"$SUBJECT"    \
    --body "$BODY"                 \
    --auth                         \
    --auth-user=user@domain.com    \
    --auth-password=d83kflb827Ms7d

【讨论】:

  • 我之所以使用一个变量,是因为在命令字符串的那部分之后有一个循环,会一个一个地添加附件。我想不出任何其他方法来实现这两者
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2023-04-09
  • 2020-04-29
相关资源
最近更新 更多