在字符串中搜索多个数组值

时间:2014-09-02 05:15:35

标签: bash if-statement for-loop

我正在使用以下逻辑查看简单的for循环:

variable=`some piped string`
array_value=(1.1 2.9)

for i in ${array_value[@]}; do
if [[ "$variable" == *some_text*"$array_value" ]]; then
    echo -e "Info: Found a matching string"
fi

问题在于,当它找到以1.1或2.9结尾的字符串作为样本数据时,我无法告诉我。

如果我在for循环中执行echo $array_value,我可以看到正在采用数组值,因此正在解析其值,尽管if循环不会返回该echo消息,尽管字符串是本。


LE: 根据收到的评论,我已经将代码抽象为类似的东西,如果我想在比较引用中使用通配符,它​​仍然无法工作

versions=(1.1 2.9)
string="system is running version:2.9"

for i in ${versions[@]}; do
        if [[ "$string" == "system*${i}" ]]; then
                echo "match found"
        fi
done

任何类似于" system * $ {i}"的结构或" * $ {i}"但是如果我指定完整的字符串模式它将起作用。

2 个答案:

答案 0 :(得分:0)

测试构造的问题与您的if语句有关。要在将要评估的表单中构造if语句,请使用:

if [[ "$variable" == "*some_text*${i}" ]]; then

注意: *some_text*需要替换为不带*通配符的实际文本。如果文本中需要*,则需要关闭globbing以防止shell扩展。如果扩展是您的目标,请使用大括号保护变量i

*some_text*置于变量i之上没有错,但根据some_text的长度,它更清晰,可以将它分配给变量本身。容纳这种情况的最简单方法是定义一个变量来保存您需要的some_text。 E.g:

prefix="some_text"
if [[ "$variable" == "${prefix}${i}" ]]; then

如果您还有其他问题,请询问。

答案 1 :(得分:-1)

"system*${i}"更改为system*$i

[[ ... ]]内包含引号会将通配符*视为文字字符而无效。

或者,如果您希望将匹配分配给变量:

match="system*"
然后你可以这样做:

[[ $string == $match$i ]]

由于$string内未执行分词,因此您实际上不需要[[ ... ]]左右的引号。

来自man bash:

[[ expression ]]
    ...
    Word splitting and pathname expansion are not 
    performed on the words between the [[ and ]]
    ...
    Any part of the pattern may be quoted to force 
    the quoted portion to be matched as a string.