Bash if语句有多个条件

时间:2016-08-07 22:09:03

标签: bash

由于我对Bash缺乏了解,我带着一个微不足道的问题来找你。我有一个'应用程序' 41个文件夹的目录。在每个文件夹中,都有一个包含glue1.css文件的css子目录。我的目标是通过bash循环删除该css文件,但我需要免除两个文件夹:adglue-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!)
  ...

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

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

以上代码结果不起作用。我得到同样的#39;没有这样的文件或目录'错误和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语句添加多个条件失败。

2 个答案:

答案 0 :(得分:2)

因为||表示逻辑或,所以以下条件将始终返回true:

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

我怀疑你想要的是:

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

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

答案 1 :(得分:0)

也许你可以避免循环并做这样的事情:

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