与 grep 一起使用的 IF-THEN 语句在 UNIX 脚本中不起作用

IF-THEN Statement used with grep not fuctioning in UNIX Script

我最近针对另一个问题发布了相同的代码。我在这方面得到了帮助,但是在尝试执行 If-Then 语句时,它返回了错误的结果。所以在这个主题中我将有 2 个问题。

第一个问题: 在文件中执行搜索时,如何实现搜索,使大写或小写在返回所需记录时没有依据?

第二题: 在我的 If-Then 语句中,无论我键入什么,它都会显示 If-Then 语句的 else 部分。例如,名称 Smith 在文件中,但无论我输入什么 "Smith" 或 "smith" 都会产生与 "echo "Error: $last_name is not in file 相同的结果"".

另外: 这必须用 korn shell 编程来编写。

代码如下:

#Gather search parameter
            read last_name
            if grep -Fxq "$last_name" 
            then
                while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest ; do
                    case "$c1" in
                        "$last_name" )
                            echo -e "Last Name: $c1\nFirst Name: $c2\nCity: $c3\nState: $c4\nClass: $c5\nSemester Enrolled: $c6\nYear First Enrolled: $c7\n\n"
                        ;;
                    esac
                done < 
            else
                echo "Error: $last_name is not in file"
            fi
        ;;

任何对此编码的深入了解将不胜感激。

编辑:

用户输入 1

用户输入:史密斯

预期输出: 姓氏:史密斯 名字:约翰 ....

实际输出:

错误:Smith 不在文件中

用户输入 2

用户输入:史密斯

预期输出:

错误:史密斯不在文件中

实际输出:

错误:史密斯不在文件中

您正在使用 grep 的 -x 选项:您的用户输入必须完全匹配整行。我假设你不想要这种行为。

使用 -i 不区分大小写

        read "last_name?Enter a last name: "

        matches=0
        grep -Fi "$last_name" "" |
        while IFS=: read c1 c2 c3 c4 c5 c6 c7 rest; do
            echo -e "Last Name: $c1\nFirst Name: $c2\nCity: $c3\nState: $c4\nClass: $c5\nSemester Enrolled: $c6\nYear First Enrolled: $c7\n\n"
            ((matches++))
        done

        if (( matches == 0 )); then
            echo "Error: $last_name is not in file"
        fi

在这种情况下,我直接遍历 grep 输出,假设不止一行可能匹配

当然,使用 grep 搜索 "last name" 是一种误导——我可以输入一个城市或年份,或者一个冒号,grep 可以找到匹配项。如果您对这一思路感兴趣,请告诉我。

要测试第一个字段的字符串相等性,awk 是一个不错的选择

read "last_name?Enter a last name: "

awk -v name="$last_name" '
    tolower() == tolower(name) {
        print "Last Name:", 
        print "First Name:", 
        print "City:", 
        print "State:", 
        print "Class:", 
        print "Semester Enrolled:", 
        print "Year First Enrolled:", 
        matches++
    }
    END {if (matches == 0) print "No matches for:", name }
' ""