我是 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_OPTIONS 的所有元素;如果找到匹配项,它会将 VALUE 设置为匹配的元素,然后使用 break
跳过检查其他元素。如果没有匹配项,VALUE 在循环后仍设置为“OTHERS”。
请注意,我将 [ "$(egrep ... )"]
替换为 egrep -s
—— if
语句检查命令的退出状态,egrep
如果找到匹配则成功,否则失败。因为这意味着我们不需要(或不希望)它来打印实际匹配项,所以我添加了 -q
(“安静”)选项来抑制输出,并删除了 -l
选项,因为列出找到匹配项的文件是双重无关的。
顺便说一句,egrep
命令看起来不对。您是在 LINE 中搜索,还是在名称存储在 LINE 中的文件中搜索?因为 egrep
希望得到文件名,而不是要搜索的文本。如果 LINE 有文本,您应该使用:
if echo "$LINE" | egrep -iq "$V"; then
在任何一种情况下,您几乎都应该将 $LINE
放在双引号中(就像我上面所做的那样),以避免对其内容进行意外的解释(分词、通配符扩展……) .在 shell 脚本中,几乎所有的变量引用都应该用双引号引起来。
关于linux - 这可以排列吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24688277/