Bash 如何";“展平”;列表变量?
在我的一个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}后真
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我想你可能误解了引号和数组是如何工作的。它在回显时的输出与作为参数传递给命令的方式不同。我建议阅读以下内容:你所说的正是我在评论中所说的。。。没有误解。谢谢