在bash中简化条件语句(if语句)

时间:2012-06-06 02:47:55

标签: bash syntax if-statement conditional-statements

我的问题更多的是关于代码效率和简单性的问题,而不是简单地完成任务。场景是这样的:我想创建一个bash脚本,它使用for循环遍历/ Users,当它在每个用户主目录中时,我希望它看到两个不同的目录是否存在以下样式:

for USER in /Users/*; do
    if [ -d "$USER/Library/Caches/com.spotify.Client" ]; then 
        rm -rf "$USER/Library/Caches/com.spotify.Client"

...但我需要检查多个目录。我如何以最优雅的方式实现这一目标?我想避免使用一系列if语句,但不知道实现此目的的最佳方法。

最后,我想使用find命令查找文件,然后将find的结果(即找到的文件的路径)设置为变量并将其输入到另一个命令中。谢谢。

2 个答案:

答案 0 :(得分:2)

根据我对你的要求的理解,我会嵌套for循环:

subdirs=(
    "Library/Caches/com.spotify.client"
    "some/other/subdir/"
)

for homedir in /Users/*; do
    for subdir in "${subdirs[@]}"; do
        dir="$homedir/$subdir"
        if [[ -d "$dir" ]]; then
            rm -rf "$dir"
        fi
    done
done

答案 1 :(得分:1)

以下内容以@David Wolever的答案为基础;这些版本更短,让shell在前面做更多的游戏。

内联,单循环版本,不使用中间(数组)变量:

for dir in /Users/*/'Library/Caches/com.spotify.client/' /Users/*/'some/other/subdir/'; do
    [[ -d "$dir" ]] && rm -rf "$dir"
done

数组变量版本:

subdirs=(
    'Library/Caches/com.spotify.client/'
    'some/other/subdir/'
)

for subdir in "${subdirs[@]}"; do
    for dir in /Users/*/"$subdir"; do 
        [[ -d "$dir" ]] && rm -rf "$dir"
    done
done