我知道如何在bash中比较两个字符串:
if [ "$build_type" = "devite" ]; then
echo "building'"
fi
但我需要检查"$build_type"是否在["devite", "relite"]中。
所以类似于以下内容:
if [ "$build_type" in ["devite", "relite"] ]; then
echo "building'"
fi
有人能解释一下这个吗?
我知道如何在bash中比较两个字符串:
if [ "$build_type" = "devite" ]; then
echo "building'"
fi
但我需要检查"$build_type"是否在["devite", "relite"]中。
所以类似于以下内容:
if [ "$build_type" in ["devite", "relite"] ]; then
echo "building'"
fi
有人能解释一下这个吗?
使用 ||
连接两个 test
/[
命令:
if [ "$build_type" = devite ] || [ "$build_type" = relite ]; then
echo "building"
fi
或者使用case
语句。
case $build_type in
devite|relite) echo "building" ;;
esac
如果目标在关联数组中,您可以检查键是否存在。
declare -A targets=([devite]= [relite]=)
if [[ -v targets[$build_type] ]]; then
echo "building"
fi
"$ build_type"
而不是 $ build_type
)。谁知道该变量中有什么,也许有空格?那样的话,在 case
中会产生奇怪的错误。 - Alfecase
的情况下,这是必要的(case $build_type in
),不是吗?编辑:似乎不需要,有趣。对我来说,这听起来像一个奇怪的例外...我仍然建议使用它们,因为记住所有不同的情况可能会出错,最终可能会在另一种情况下留下它们是必要的,而它们从来没有错。对我来说,没有双引号的用法已经像是“我明确地想要在这种情况下分割单词”。 - Alfecase "$build_type" in
devite|relite)
echo "building"
;;
esac
管道符号 (|
) 表示“或”逻辑。
当然,使用 shell 内置的 case
命令可以做更多的事情,比如为不同的情况指定处理代码。但对于固定列表中的简单字符串(在字符串中包含特殊字符可能会变成引用噩梦),它是最容易阅读的东西。
如果您真的想使用列表数组,我建议使用循环:
names=( devite relite )
for name in "${names[@]}"
do
if [ "$build_type" = "$name" ]
then
echo "building"
break # leave the loop
fi
done
a=(devite relite)
),你可以这样操作:if [[ "${a[@]}" =~ $build_type ]]; then ...
build_type
类似于 ite rel
,则会匹配。 - chepnergrep
:#!/bin/bash
declare -a types=("devite" "relite")
type=devite
neg=dovite
if grep -q "${type}" <<< "${types[*]}" ; then
echo "building"
else
echo "not building"
fi
if grep -q "${neg}" <<< "${types[*]}" ; then
echo "building"
else
echo "not building"
fi
=> building
not building
我有很多种方法来解决这个问题 :)
编辑:如果您不能信任输入的有效性:
#!/bin/bash
declare -a types=("devite" "relite")
type=devite
neg="ite rel"
function j { local IFS=$'\n'; echo "$*"; }
if grep -q "${type}" <<< $(j "${types[@]}") ; then
echo "building"
else
echo "not building"
fi
if grep -q "${neg}" <<< $(j "${types[@]}") ; then
echo "building"
else
echo "not building"
fi
ite rel
的类型会导致误报。 - chepner
bash
没有列表。最接近的类比是检查一个字符串是否是给定关联数组中的键。 - chepner