如何“压扁”列表变量?

时间:2012-02-23 15:28:40

标签: 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懦弱地拒绝创建一个空档案,因为它取代${EXLIST}后真正得到的是:

echo --exclude='/data/sub1/*' | /usr/bin/xargs -0 tar -cf /home/_data.tar

这告诉我换行了吗?

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

有没有办法在 bash 中将行“扁平化”为字符串,以便tar可以处理它?<​​/ p>

1 个答案:

答案 0 :(得分:3)

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

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

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

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