将 if/else 与 bash 脚本中的 find 命令中的变量结合起来

将 if/else 与 bash 脚本中的 find 命令中的变量结合起来

我正在编写一个脚本,提示用户输入,然后运行查找命令。

我所拥有的有效,但由于 if / else 结构,感觉我有很多重复的代码。是否可以有内联if语句?

所以,而不是这种事情:

if [[ $depth_boolean == y ]] || [[ $depth_boolean == yes ]]
    then
        if [[ $symlink_boolean == y ]] || [[ $symlink_boolean == yes ]]
        then
            find -L $location -maxdepth $depth -readable -iname "$query" -$find_type $find_type_option -$find_action
        else
            find $location -maxdepth $depth -readable -iname "$query" -$find_type $find_type_option -$find_action
        fi
    else
        if [[ $symlink_boolean == y ]] || [[ $symlink_boolean == yes ]]
        then
            find -L $location -readable -iname "$query" -$find_type $find_type_option -$find_action
        else
            find $location -readable -iname "$query" -$find_type $find_type_option -$find_action
        fi
    fi

可以做这样的事情吗?

find if [ $symlink_boolean == y ]; then echo "-L";
   fi $location if [ $symlink_boolean == y ]; then 
   echo "-maxdepth $depth"; fi -readable -iname "$query" 
   -$find_type $find_type_option -$find_action

上面的方法不行,但是想知道是否可行?

答案1

您可以使用一个简单的变量来处理符号链接:

symlink_flag=
if [[ $symlink_boolean == y ]]; then
    symlink_flag=-L
fi
find $symlink_flag "$location" -maxdepth "$depth" -readable ...

请注意,$symlink_flag此处未加引号,因此如果为空,它将消失。它所具有的值不包含任何通配符或默认IFS字符,因此不引用它不会造成任何损害。其他变量应该被引用,因为例如该位置很可能包含空格。

对于深度部分,最好的选择是在数组中构建命令行:

arguments=()
if [[ $symlink_boolean == y ]]; then
    arguments+=(-L)
fi
arguments+=("$location")
if [[ $depth_boolean == y ]]; then
    arguments+=(-maxdepth "$depth")
fi
find "${arguments[@]}" -readable -iname ...

您可以像上面那样将不变的选项放在find命令行上,或者只是无条件地将它们附加到数组中并运行find "${arguments[@]}"

也可以看看:


从技术上讲,您还可以通过命令替换来执行您建议的操作:

find $(if [[ $symlink_boolean == y ]]; then printf %s -L; fi) "$location"
    $(if [[ $depth_boolean == y ]]; then echo -maxdepth $maxdepth; fi) ...

虽然一般来说这不是最佳的,但从命令替换中生成多个单词的唯一方法是将它们用空格分隔,然后拆分,但如果其中有单词应该包含空格,那么这又不能很好地工作。不过应该可以。-maxdepth N


作为旁注,您可以使用例如稍微压缩条件[[ $symlink_boolean == [Yy]* ]]。它将检查变量是否以 aY或 a开头y。 (如果您不介意诸如YEAAHHH真实值之类的东西。)使用正则表达式匹配[[ $symlink_boolean =~ ^(y|yes)$ ]]case $symlink_boolean in y|yes) echo "true";; esac仅允许这两个值。

相关内容