我必须动态地为tar命令构建排除。排除列表将很短(如果有的话),更好的方法是为命令行构建一个--exclude =参数列表,而不是使用带有--exclude-from的临时文件。但是使用bash变量不起作用。看看这个考试:
~/test$ EXCLUDES=" --exclude='./do-not-backup'"
~/test$ echo $EXCLUDES
--exclude='./do-not-backup'
~/test$ tar czf backup.tgz $EXCLUDES ./
~/test$ tar tzf backup.tgz
./
./dir1/
./dir1/file1
./do-not-backup/ <=== wrong
./do-not-backup/nofile <=== wrong
./dir2/
./dir2/file2
./backup.tgz
~/test$ rm backup.tgz
~/test$ tar czf backup.tgz --exclude='./do-not-backup' ./ # Same command without bash variable
~/test$ tar tzf backup.tgz
./
./dir1/
./dir1/file1
./dir2/
./dir2/file2
./backup.tgz
我想念的是什么?
答案 0 :(得分:3)
存储可能包含空格的参数的最佳方法是在数组中。每个参数都可以是一个单独的数组条目,带或不带空格。
$ excludes=(--exclude='./do-not-backup')
$ printf '%q\n' "${excludes[@]}"
--exclude=./do-not-backup
$ tar -czf backup.tgz "${excludes[@]}" ./
这里的单引号是可选的,就像你正常输入--exclude
参数一样。如您所见,Bash在创建数组时解析引号,并且它们实际上并未存储在数组值中。