我是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
答案 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脚本中,几乎所有变量引用都应该是双引号。