我尝试在 bash shell 上为备份脚本生成命令行。
简单示例:
EXCLUDES="/home/*/.cache/* /var/cache/* /var/tmp/* /var/lib/lxcfs/cgroup/*";
for FOLDER in $EXCLUDES; do printf -- '--exclude %b\n' "$FOLDER" ; done
应该导致:
--exclude '/home/*/.cache/*' --exclude '/var/cache/*' --exclude '/var/tmp/*' --exclude '/var/lib/lxcfs/cgroup/*'
但问题是,文件夹是从 shell 中扩展的。我确实用 echo / printf / quoting / IFS 尝试了很多例子......但没有正确的结果。
有任何解决这个问题的方法吗?
每当您必须指定路径名列表或带有文件名 glob 的路径名列表,或者通常只是您打算循环和/或用作某些命令的参数列表的列表时,请使用数组。
如果你不使用数组而是使用字符串,你将无法处理其中包含空格的东西(因为你使用空格作为字符串中的分隔符)。这也使得循环字符串的内容变得困难,因为您将不得不调用分词(通过不引用变量扩展)。但这也会导致文件名通配发生,除非您使用
set -f
.在大多数 shell 中,即使在 plain 中
/bin/sh
,也使用数组代替。在sh
中,使用位置参数数组 ($@
)。对于
bash
,使用带引号的字符串数组,例如然后,
之后,
请注意,引用在上述所有变量扩展中都很重要。扩展
"${array[@]}"
(以及"$@"
下面的)会产生一个列表,其中包含所讨论数组的单独引用的元素(但前提是双引号!)。对于任何
/bin/sh
外壳: