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

在UNIX脚本中与grep一起使用的IF-THEN语句不起作用,unix,if-statement,ksh,Unix,If Statement,Ksh,我最近发布了另一个问题的相同代码。我在这方面得到了帮助,但在尝试实现If-Then语句时,它返回了错误的结果。因此,在这个主题中,我有两个问题 第一个问题: 在文件中执行搜索时,如何实现搜索,使大写或小写不以返回所需记录为基础 第二个问题: 在If-Then语句中,无论键入什么,它都会显示If-Then语句的else部分。例如,文件中有名称Smith,但无论我键入什么“Smith”或“Smith”,都会产生与“echo”错误相同的结果:$last_name不在文件“”中 另外: 这必须用korn

我最近发布了另一个问题的相同代码。我在这方面得到了帮助,但在尝试实现If-Then语句时,它返回了错误的结果。因此,在这个主题中,我有两个问题

第一个问题: 在文件中执行搜索时,如何实现搜索,使大写或小写不以返回所需记录为基础

第二个问题: 在If-Then语句中,无论键入什么,它都会显示If-Then语句的else部分。例如,文件中有名称Smith,但无论我键入什么“Smith”或“Smith”,都会产生与“echo”错误相同的结果:$last_name不在文件“”中

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

代码如下:

#Gather search parameter
            read last_name
            if grep -Fxq "$last_name" $1
            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 < $1
            else
                echo "Error: $last_name is not in file"
            fi
        ;;
#收集搜索参数
读姓
如果grep-Fxq“$last_name”$1
然后
而IFS=:读取c1 c2 c3 c4 c5 c6 c7剩余;做
中的“$c1”号案例
“$last_name”)
echo-e“姓氏:$c1\n名字:$c2\nCity:$c3\n状态:$c4\n类:$c5\n注册的域名:$c6\n首次注册的域名:$c7\n\n”
;;
以撒
已完成<$1
其他的
echo“错误:$last_name不在文件中”
fi
;;
如果您能深入了解此代码,我们将不胜感激

编辑:

用户输入1

用户输入:Smith

预期产出: 姓:史密斯 名字:约翰

实际产量:

错误:史密斯不在文件中

用户输入2

用户输入:smith

预期产出:

错误:史密斯不在文件中

实际产量:


错误:smith不在文件中

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

使用
-i
表示不区分大小写

        read "last_name?Enter a last name: "

        matches=0
        grep -Fi "$last_name" "$1" |
        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搜索“姓氏”有误导性——我可以输入一个城市、一年或冒号,grep可以找到匹配项。如果你对这一思路感兴趣,请告诉我

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

read "last_name?Enter a last name: "

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

好吧,把grep-Fxq改成grep-Fiq,如果我把它全部用小写,比如Smith,它仍然不会出现Smith记录。但是,输入“Smith”将立即调出文件,而不是在它发出错误消息之前。奇怪的是,如果我输入“smith”,它将不会显示错误消息,它只是退出case语句。这是因为您的grep搜索不区分大小写,但大小写字符串比较不区分大小写。请回顾我的回答谢谢Glenn这很有效。我必须按姓氏搜索,这是说明的一部分。这将帮助我实现这个程序的其他方面,尽管如此,谢谢。实际上刚刚遇到了一些意想不到的结果。同样,如果我搜索smith记录并输入“sm”、“ith”或smith字符串中的任何字符,它将显示smith记录。是否有一种方法可以使它仅在它是smith、smith、smith或任何组合而不仅仅是某些字符时显示。这没什么大不了的,只是当我输入“s”时,会显示一条不同的记录。这就是我在上一段中提醒的。你真的想要第一个字段不区分大小写的字符串相等,对吗?是的,好的,我明白你在最后一段中的意思了。是的,它不断地给我一些记录,这些记录在itI中只有几个字符,没有perl、awk或数组的显式指令。我知道这很难。然而,我正在做一些搜索,我想我可以在某种程度上使用白鹭。我还在研究。