在 bash 中通过变量传递选项不起作用

在 bash 中通过变量传递选项不起作用

运行下面的命令时,我遇到了一个非常奇怪的行为,让我解释一下这个问题:

考虑这个简单的 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)

相关内容