我正在编写一个脚本,提示用户输入,然后运行查找命令。
我所拥有的有效,但由于 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
仅允许这两个值。