这可能是阵列吗?

时间:2014-07-11 00:12:58

标签: linux bash shell

我是bash的新手,我只想询问下面的代码(多个if语句)是否可以转换为数组? 这里:

if [ "$(egrep -l 'PRODUCT' $LINE)" ];then
        VALUE='PRODUCT'
        elif [ "$(egrep -il 'SERVICE' $LINE)" ];    then
                    VALUE='SERVICE'
        elif [ "$(egrep -il 'COMMERCE' $LINE)" ];   then
                    VALUE='COMMERCE'
        elif [ "$(egrep -il 'EDUCATION' $LINE)" ];  then
                    VALUE='EDUCATION'
        else
                    VALUE='OTHERS'
fi

1 个答案:

答案 0 :(得分:1)

如果我理解你要找的东西,你可以这样做:

VALUE_OPTIONS=(PRODUCT SERVICE COMMERCE EDUCATION)

VALUE='OTHERS'  # Default value, in case none of the "real" values match
for V in "${VALUE_OPTIONS[@]}"; do
    if egrep -iq "$V" "$LINE"; then
        VALUE="$V"
        break
    fi
done

这循环遍历VALUE_OPTIONS的所有元素;如果找到匹配项,则将VALUE设置为匹配的元素,然后使用break跳过检查其他元素。如果没有匹配,则VALUE仍设置为' OTHERS'循环之后。

请注意,我将[ "$(egrep ... )" ]替换为egrep -s - if语句检查命令的退出状态,egrep如果找到匹配则成功,失败除此以外。由于这意味着我们不需要(或希望)它打印实际匹配,我添加了-q(" quiet")选项来抑制输出,并删除了{{1因为列出找到匹配项的文件是双重无关的。

BTW,-l命令看起来不对。您是在尝试在LINE中搜索,还是在名称存储在LINE中的文件中搜索?因为egrep期望获得文件名,而不是要搜索的文本。如果LINE包含文本,则应使用:

egrep

在任何一种情况下,您几乎肯定会将if echo "$LINE" | egrep -iq "$V"; then 置于双引号中(如上所述),以避免其内容的意外解释(分词,通配符扩展等)。在shell脚本中,几乎所有变量引用都应该是双引号。