运行下面的命令时,我遇到了一个非常奇怪的行为,让我解释一下这个问题:
考虑这个简单的 bash 脚本:
#!/bin/bash
zip -r /var/backup.zip /var/www -x /ignore_dir_1/\*
它递归地压缩整个www
文件夹并排除 ignore_dir_1
这完全没问题。
现在,像这样编写脚本:
#!/bin/bash
Exclude="/ignore_dir_1/\*"
zip -r /var/backup.zip /var/www -x $Exclude
运行没有错误但是不排除 ignore_dir_1
。
谁能解释一下这种行为吗?
- 免责声明:
我已经尝试过以下替代方案:
Exclude="/ignore_dir_1/*"
Exclude="/ignore_dir_1/***"
更新:
感谢@pLumo,通过将变量放在引号内解决了问题,例如:
#!/bin/bash
Exclude="/ignore_dir_1/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
现在的问题是Exclude
变量是否包含多个文件夹,它不起作用,我的意思是:
#!/bin/bash
Exclude="/ignore_dir_1/* /ignore_dir_2/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
我什至尝试过"${Exclude}"
但没有结果。
答案1
如果你写...
Exclude="/ignore_dir_1/* /ignore_dir_2/*"
zip -r /var/backup.zip /var/www -x "$Exclude"
,作为单个参数zip
接收 $Exclude
,并将文件之间的空格视为路径的一部分。
要将多个参数传递给命令,您需要使用array
.
Exclude=("/ignore_dir_1/*" "/ignore_dir_2/*")
zip -r /var/backup.zip /var/www -x "${Exclude[@]}"
这可确保项目单独展开并作为参数传递给您的命令。
答案2
pLumo 的忍者 :-P
我建议你使用数组,
#!/bin/bash
echo "directory tree ---------------------------------------------------"
find
echo "without exclusions -----------------------------------------------"
echo zip -sf -r backup.zip .
zip -sf -r backup.zip .
echo "with exclusions --------------------------------------------------"
declare -a Exclude=(ignore_dir_1/\* ignore_dir_2/\*)
echo zip -sf -r backup.zip . -x ${Exclude[@]}
zip -sf -r backup.zip . -x ${Exclude[@]}
echo 'double quoted ${Exclude[@]} --------------------------------------'
echo zip -sf -r backup.zip . -x "${Exclude[@]}"
zip -sf -r backup.zip . -x "${Exclude[@]}"
在“试运行”之前显示目录树的结果,
$ ./script
directory tree ---------------------------------------------------
.
./dir_0
./dir_0/file-1
./dir_0/file-2
./ignore_dir_1
./ignore_dir_1/file-11
./ignore_dir_1/file-12
./ignore_dir_2
./ignore_dir_2/file name with spaces
./ignore_dir_2/file-22
./ignore_dir_2/file-21
./script
without exclusions -----------------------------------------------
zip -sf -r backup.zip .
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
ignore_dir_1/
ignore_dir_1/file-11
ignore_dir_1/file-12
ignore_dir_2/
ignore_dir_2/file name with spaces
ignore_dir_2/file-22
ignore_dir_2/file-21
script
Total 11 entries (621 bytes)
with exclusions --------------------------------------------------
zip -sf -r backup.zip . -x ignore_dir_1/file-11 ignore_dir_1/file-12 ignore_dir_2/file-21 ignore_dir_2/file-22 ignore_dir_2/file name with spaces
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
ignore_dir_1/
ignore_dir_2/
script
Total 6 entries (621 bytes)
double quoted ${Exclude[@]} --------------------------------------
zip -sf -r backup.zip . -x ignore_dir_1/* ignore_dir_2/*
Would Add/Update:
dir_0/
dir_0/file-1
dir_0/file-2
script
Total 4 entries (621 bytes)