Shell在命令串中嵌入带有空格的变量

时间:2017-03-06 14:17:50

标签: bash shell

这个例子是基于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"'

这是在开始和结束时使用单个qoutes,并在每个变量周围使用双引号。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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[@]}"