Bash 如何";“展平”;列表变量?

Bash 如何";“展平”;列表变量?,bash,Bash,在我的一个bash脚本中,我有一个变量,其中包含要从tar中排除的目录列表,以及要处理的父目录: EXLIST="\ --exclude='/data/sub1/*' \ --exclude='/data/sub2/*' \ --exclude='/data/sub3/*' \ /data \ " echo ${EXLIST} | /usr/bin/xargs -0 tar -cf _data.tar 但是,tar cowardly拒绝创建空存档,因为它在替换${EXLIST}后真

在我的一个bash脚本中,我有一个变量,其中包含要从
tar
中排除的目录列表,以及要处理的父目录:

EXLIST="\
 --exclude='/data/sub1/*' \
 --exclude='/data/sub2/*' \
 --exclude='/data/sub3/*' \
 /data \
 "

echo ${EXLIST} | /usr/bin/xargs -0 tar -cf _data.tar
但是,tar cowardly拒绝创建空存档,因为它在替换
${EXLIST}
后真正收到的是:

echo --exclude='/data/sub1/*' | /usr/bin/xargs -0 tar -cf /home/_data.tar
这告诉我,新线正在成为阻碍

当然,我可以将
EXLIST
定义为一行,但我不愿意这样做,因为这会降低列表的可读性


bash中,是否有一种方法可以将行“展平”为字符串,以便
tar
可以处理它?

在这种情况下,您应该使用数组,而不使用xargs

EXLIST=("--exclude='/data/sub1/*'" \
        "--exclude='/data/sub2/*'" \
        "--exclude='/data/sub3/*'" \
        "/data")

tar -cf _data.tar "${EXLIST[@]}"

使用此方法,数组的每个元素都是tar的单独参数

事实上,我的基于字符串的EXLIST和你的基于数组的EXLIST之间的唯一区别是,在回显时,2个空格(在我的中)与1个空格(在你的中)。但是…您的回答帮助我解决了将
${EXLIST}
作为参数传递给另一个没有引号的脚本的问题。一旦我将
${EXLIST[@]}
更改为
“${EXLIST[@]}”
,这两种形式都非常有效。所以接受你的答案。@ateiob我想你可能误解了引号和数组是如何工作的。它在回显时的输出与作为参数传递给命令的方式不同。我建议阅读以下内容:你所说的正是我在评论中所说的。。。没有误解。谢谢