【问题标题】:An if statement with multiple conditions [duplicate]具有多个条件的 if 语句[重复]
【发布时间】:2016-12-13 15:03:40
【问题描述】:

由于我对 Bash 缺乏了解,所以我带着一个小问题来找你。我有一个包含 41 个文件夹的“应用程序”目录。在每个文件夹中,都有一个css 子目录,其中包含一个glue1.css 文件。我的目标是通过 bash 循环删除该 css 文件,但我需要排除两个文件夹:ad 和 glue-resources。

我需要豁免 ad 文件夹,因为没有 css 文件。我想防止执行时出现以下错误:

rm: ad/css/glue1.css: No such file or directory

考虑这个假设的目录(为简洁起见,缺少 41 个文件夹):

Apps
  ad
    css
      (empty)
  glue-resources
    css
      glue1.css (keep this file!)
  profile
    css
      glue1.css (remove this file!)
  ...

这是我到目前为止的代码。如果父目录路径不等于glue-resources/css/ 或ad/css/,它应该在glue1.css 文件上调用rm。

for dir in **/css/; do
if [[ "${dir}" != 'glue-resources/css/' || "${dir}" != 'ad/css/' ]]; then
    rm "${dir}"glue1.css
fi
done

上面的代码结果不起作用。我得到相同的“没有这样的文件或目录”错误,glue-resources/css 中的glue1.css 文件已被删除。我不太清楚为什么它不起作用 - 我在某处读到,如果您使用 [[ 和 ]],您可以组合多个条件。

我认为问题在于我不明白 bash 中的多个条件是如何工作的。以下版本的代码可以工作。

for dir in **/css/; do
if [[ "${dir}" != 'glue-resources/css/' ]]; then
    rm "${dir}"glue1.css
fi
done


for dir in **/css/; do
if [[ "${dir}" != 'ad/css/' ]]; then
    rm "${dir}"glue1.css
fi
done

我尝试向 if 语句添加多个条件失败。

【问题讨论】:

标签: bash if-statement syntax


【解决方案1】:

因为||代表逻辑或,所以下面的条件总是会返回真:

[[ "${dir}" != 'glue-resources/css/' || "${dir}" != 'ad/css/' ]]

我怀疑你想要的是:

[[ "${dir}" != 'glue-resources/css/' && "${dir}" != 'ad/css/' ]]

&& 是逻辑与。它要求同时满足这两个条件。

【讨论】:

    【解决方案2】:

    也许您可以避免循环并执行以下操作:

    find . -path ./glue-resources -prune -o -name glue1.css | xargs -I [] rm []
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 2017-09-28
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      相关资源
      最近更新 更多