String Bash将多个带空格的字符串发送给参数,参数应为空格分隔列表(AWS CLI)

String Bash将多个带空格的字符串发送给参数,参数应为空格分隔列表(AWS CLI),string,bash,variables,String,Bash,Variables,我尝试使用AWS CLI发送SES电子邮件,但这个问题与Bash变量、IFS和扩展的关系比与AWS相关的任何问题都要大 My recipients变量的格式如下: TO="\"My Name<name@email.com>\" \"Your Name<you@email.com>\"" 一切正常。但是,如果我执行以下任一操作,则会从--to参数将$to视为单个字符串或在收件人“name”中的空格上拆分得到错误: aws ses send-email --to "$TO"

我尝试使用AWS CLI发送SES电子邮件,但这个问题与Bash变量、IFS和扩展的关系比与AWS相关的任何问题都要大

My recipients变量的格式如下:

TO="\"My Name<name@email.com>\" \"Your Name<you@email.com>\""
一切正常。但是,如果我执行以下任一操作,则会从
--to
参数将
$to
视为单个字符串或在收件人“name”中的空格上拆分得到错误:

aws ses send-email --to "$TO"
aws ses send-email --to $(echo "$TO")
aws ses send-email --to "$(echo "$TO")"
sed ses send-email --to "$(echo $TO)"
如何获取
--to
参数,将变量视为空格分隔的列表,但仍然尊重每个电子邮件地址的引号

编辑:

这是在一个docker容器中运行的,我在其中获得作为字符串传递的参数,其中一个是
-email \“My Name\”
,其中email的参数可以是一个或多个电子邮件地址。我正在隔离电子邮件地址,如下所示:

if [[ "$ITEM" =~ ^-email[[:space:]]+(.*)$ ]]; then
  EMAIL=("${BASH_REMATCH[1]}")
fi
在这种情况下,$EMAIL变量是一个字符串,不适合使用数组方法。如果我这样做

if [[ "$ITEM" =~ ^-email[[:space:]]+(.*)$ ]]; then
  EMAIL=($(echo ${BASH_REMATCH[1]}"))
fi

然后,电子邮件以一个数组结束,字符串之间用空格分隔,因此它分解了嵌入引号内的部分。因此,如果我手动将
$设置为
变量,那么没有问题,但由于它是作为参数输入的,我认为这更复杂。我确实有能力指定电子邮件地址之间应该使用的分隔符,如果这样可以更容易地解析?也许将整个参数作为字符串读取,然后用特殊的分隔符(如逗号)将其拆分成一个数组?或者将分隔符设置为
模式”

要“尊重”引号,需要将它们解析为语法。通常,将数据视为语法是非常危险的——如果您从一开始就通过解析器反馈内容(如
eval
),那么包含
$(rm-rf~)
的收件人姓名将导致维护运行代码的方框的人度过非常糟糕的一天是否作为单个字符串传入?这是一个非常不幸的设计(与将每个最终参数作为单独的参数预先传递相反),但实际上我们已经有问题描述如何在知识库中处理它。(最佳实践方法是使用
xargs
将其拆分为一个NUL分隔的列表,然后将其读入数组中)。我现在就坐下来吃午饭(并在后面直接开会),但我回来后会根据编辑和澄清对重复列表进行适当的编辑。是的,不幸的是,有大量参数通过入口点传递到docker容器,而不仅仅是
-email
,分组和识别它们的唯一好方法是将每个参数作为自己的字符串传递,即使它有多个值。因此,我不确定我是否同意“唯一好的方法”。例如,如果是两个类别,那么使用sigil是相当常见的:
/yourprogram--type1 arg“foo”--type1选项--type2 arg“bar”
。或者
/yourprogram--type1 arg--foo--type1 arg something--type1 arg--bar--type2 arg--baz
,然后将type-1数组组装成
--foo something--bar
,将type-2数组组装成
--baz
。为了“尊重”引号,需要将它们作为语法进行解析。通常,将数据视为语法是非常危险的——如果您从一开始就通过解析器反馈内容(如
eval
),那么包含
$(rm-rf~)
的收件人姓名将导致维护运行代码的方框的人度过非常糟糕的一天是否作为单个字符串传入?这是一个非常不幸的设计(与将每个最终参数作为单独的参数预先传递相反),但实际上我们已经有问题描述如何在知识库中处理它。(最佳实践方法是使用
xargs
将其拆分为一个NUL分隔的列表,然后将其读入数组中)。我现在就坐下来吃午饭(并在后面直接开会),但我回来后会根据编辑和澄清对重复列表进行适当的编辑。是的,不幸的是,有大量参数通过入口点传递到docker容器,而不仅仅是
-email
,分组和识别它们的唯一好方法是将每个参数作为自己的字符串传递,即使它有多个值。因此,我不确定我是否同意“唯一好的方法”。例如,如果是两个类别,那么使用sigil是相当常见的:
/yourprogram--type1 arg“foo”--type1选项--type2 arg“bar”
。或者
/yourprogram--type1 arg--foo--type1 arg something--type1 arg--bar--type2 arg--baz
,然后将type-1数组组装为
--foo something--bar
,将type-2数组组装为
--baz
if [[ "$ITEM" =~ ^-email[[:space:]]+(.*)$ ]]; then
  EMAIL=($(echo ${BASH_REMATCH[1]}"))
fi