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