【发布时间】: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 语句添加多个条件失败。
【问题讨论】:
-
试试shellcheck,它会自动检测到this issue。
标签: bash if-statement syntax