linux - 这可以排列吗?

标签 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

最佳答案

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

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/

相关文章:

linux - 日志文件中 2 个日期之间的 Bash Grep 行

java - Itext5 程序在 Windows 上执行时遇到字符集问题?

linux - 通讯命令不比较单词

Bash 脚本中的正则表达式

linux - 如何写 "bash script.sh argument "

bash - 使用 expect 确认密码

shell - 测试两条相邻线

python - 使用python从重定向的标准输入读取文件

linux - C++ 生成文件安装 : start program at boot and reboot

linux - 如何查看目录中所有文件的前 30 行(或头部)?