我是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

最佳答案

如果我明白你在找什么,你可以这样做:

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_选项的所有元素;如果找到匹配项,则将VALUE设置为匹配的元素,然后使用break跳过对其他元素的检查。如果没有匹配的内容,则在循环后值仍设置为“其他”。
注意,我用[ "$(egrep ... )" ]代替了egrep -s——if语句检查命令的退出状态,如果找到匹配,egrep成功,否则失败。因为这意味着我们不需要(或者不想)它来打印实际的匹配,所以我添加了-q(“quiet”)选项来抑制输出,并删除了-l选项,因为列出找到匹配的文件是完全不相关的。
顺便说一下,这个egrep命令看起来是错误的。您是要在行中搜索,还是在名称存储在行中的文件中搜索?因为egrep需要给定文件名,而不是要搜索的文本。如果第行有文本,则应使用:
if echo "$LINE" | egrep -iq "$V"; then

在这两种情况下,您几乎肯定应该将$LINE放在双引号中(如我在上面所做的),以避免对其内容进行意外的解释(分词、通配符扩展等)。在shell脚本中,几乎所有的变量引用都应该用双引号引起来。

关于linux - 可以排列吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24688277/

10-12 20:25