Bash 脚本 - 在 case 结构或 if else 语句中不执行读取命令

标签 bash ubuntu

我有一个 $empIc 这是用户输入的变量。我尝试从文本文件中读取一些详细信息并检查变量 $ic .如果输入不匹配,将执行无效的脚本文件,让用户选择重新输入输入或返回菜单。但是,无效脚本中的读取命令永远不会执行并导致无限循环。

 while IFS=':' read -r dep ic name phone email gender birthDate jobTitle joinDate
 do
  if [ "$empIc" = "$ic" ]
  then
    echo -n "Employee Name : $name"; echo
    echo -n "Job Title     : $jobTitle"; echo
    echo -n "Department    : $dep"; echo 
    break
  else
    match=0
  fi
  case $match in
  0) echo "No such record!"; ./invalidic; break;;
  *) 
  esac
done <Employee.txt
这是无效脚本文件的代码:
#!/bin/bash

while true
do
  echo "========================================="
  echo "1. Enter Performance Review again"
  echo "2. Back to Human Resource Management Menu"
  echo "========================================="
  echo "What would you like to do? Please enter choice in number: "; read action
  case $action in
  1) ./task4_main; break;;
  2) ./task1_menu; break;;
  *) echo "Please enter 1 for Performance Review, 2 to back to Human Resource Management Menu"
  esac
done
This is the output I get when the input does not match with data stored

最佳答案

直接的问题是 invalidicwhile ... read ... done <Employee.txt 内运行循环,所以它从 Employee.txt 文件而不是终端读取。但这是另一个问题的结果:您可能想运行 invalidic如果没有匹配 $empIc在Employees.txt 文件中,但如果Employees.txt 中的第一行不匹配,则当前脚本运行它。它还尝试为每个不匹配的行运行它,但是因为它永远不会超过第一个不会发生的行。
您需要等到循环完成对Employees.txt 文件中每一行的检查,如果它到达末尾没有找到匹配项,那么您应该运行invalidic。 .也就是说,做这样的事情:

match=0   # No match found *yet*, because we haven't started looking

while IFS=':' read -r dep ic name phone email gender birthDate jobTitle joinDate
 do
  if [ "$empIc" = "$ic" ]
  then
    echo "Employee Name : $name"    # Don't use `echo -n`, then `echo` to add a newline. Just skip the -n
    echo "Job Title     : $jobTitle"
    echo "Department    : $dep" 
    match=1    # Found a match
    break
  fi
done <Employee.txt

# If we *still* haven't found a match (now that we've now scanned the
# entire file) then there isn't a match there.
case $match in
  0) echo "No such record!"; ./invalidic;;
  *) 
esac
实际上,我会替换最后一个 case用一个简单的if [ "$match" = 0 ] -- 您不需要 case 的强大功能和复杂性在这里,IMO 和 if是更好的选择。
注意:我也有点担心您正在使用 GOTO 之类的脚本执行。内部 invalidic ,您可以运行 task4_maintask1_main , 这两个听起来像是主要任务,而不是无效 ID 处理程序的子任务。当你运行类似 ./somescript 的东西时,你真的应该运行一个子任务,而不仅仅是那是下一个合乎逻辑的事情。

关于Bash 脚本 - 在 case 结构或 if else 语句中不执行读取命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63439890/

相关文章:

bash - 从 postgres 函数/过程/触发器执行 Bash 脚本(Shell 脚本)

linux - 使用 shell 脚本在不使用查找的情况下删除超过 30 天的文件

php - mv 命令不能从 bash 脚本 php 工作

linux - 停止用户访问系统几天

ubuntu - MLton SML 编译器在 Bascinet 中构建失败

bash - 如何使用 setenv 在 bash 中设置环境变量?

Bash shell 脚本语法问题 : Target is not a directory?

unix - 从终端更改 unix 文件权限

Python CGI 内部错误 login.html login.cgi

linux - 用于 Linux 开发的 Visual C++ + Docker