免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3504 | 回复: 5
打印 上一主题 下一主题

shell读取命令行输入后,循环验证问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-19 12:00 |只看该作者 |倒序浏览
a.wd文件:
1_a
2_b
3_c

希望结果按行读取,以下划线分隔,命令行打印显示每行第1部分,人工输入第2部分。
验证第2部分输入与源文件第2部分字符一致时候,继续下一行流程,如果人工输入不对循环直到输入正确为止;
例如:
#读取第一行时屏幕打印
1 pls input ew:
#输入正确的当前行第2部分:
a
#进入下一个循环流程:
2 pls input ew:



我自己写了一个shell,但是一下就把所有行循环输出了。怎么修改请指点一下。
while read line
do
        while :
        do
                cw=`echo $line | awk -F"_" '{print $1}'`
                echo $cw "pls input ew:"
                ew=`echo $line | awk -F"_" '{print $2}'`
                read sign
                if [ "$sign" == "$ew" ];then
                echo $sign
                        break
                fi
        done
done <  a.wd

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2012-03-19 12:35 |只看该作者
回复 1# spouter


    awk:
  1. awk -F'_' '{a[$1]=$2}
  2. END{i=1;
  3. while(getline line <"/dev/tty"){if(i==3)break;if(a[i]==line){print  "pls input next!";i++}else{print  "sorry! pls try again!"}}}' file
  4. a
  5. pls input next!
  6. b
  7. pls input next!
  8. c

  9. awk -F'_' '{a[$1]=$2}
  10. END{i=1;
  11. while(getline line <"/dev/tty"){if(i==3)break;if(a[i]==line){print  "pls input next!";i++}else{print  "sorry! pls try again!"}}}' file
  12. d
  13. sorry! pls try again!
  14. a
  15. pls input next!
  16. d
  17. sorry! pls try again!
  18. c
  19. sorry! pls try again!
  20. b
  21. pls input next!
  22. c
复制代码

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
3 [报告]
发表于 2012-03-19 12:52 |只看该作者
read sign </dev/tty

论坛徽章:
0
4 [报告]
发表于 2012-03-19 12:55 |只看该作者
本帖最后由 Perl_Er 于 2012-03-19 14:13 编辑

标准输入变了,所以你的第二个read的输入不是STDIN,而是那个文件,所以在第二个read的时候要回复STDIN
  1. -bash-3.2$ ./verification.sh
  2. Please type for 1:
  3. a
  4. You are right
  5. Please type for 2:
  6. b
  7. You are right
  8. Please type for 3:
  9. c
  10. You are right
  11. -bash-3.2$ cat verification.sh
  12. #!/bin/bash

  13. exec 3<&0
  14. exec <verification.txt
  15. exec 4<&0
  16. while read line
  17. do
  18.         field1=${line%_*}
  19.         field2=${line#*_}
  20.         exec 0<&3
  21.         echo "Please type for ${field1}:"
  22.         read f2
  23.         while [ "${f2}" != "${field2}" ]
  24.         do
  25.                 echo "You typed incorrectly"
  26.                 echo "Please type for ${field1}:"
  27.                 read f2
  28.         done
  29.         echo "You are right"
  30.         exec 0<&4
  31. done
  32. -bash-3.2$ cat verification.txt
  33. 1_a
  34. 2_b
  35. 3_c
  36. -bash-3.2$
复制代码
回复 1# spouter


   

论坛徽章:
0
5 [报告]
发表于 2012-03-19 12:56 |只看该作者
waker 发表于 2012-03-19 12:52
read sign



原来是这样!受教了,多谢!

论坛徽章:
0
6 [报告]
发表于 2012-05-08 20:31 |只看该作者
本帖最后由 maojian60 于 2012-05-08 20:37 编辑

改成 for循环 可以

#!/bin/bash
#
#
for line in `cat file.txt`
do

while :
do
aa=`echo $line |awk -F "_" '{print $1}'`
echo -n "$aa please input:"
read cc
bb=`echo $line |awk -F "_" '{print $2}'`
if [ $cc = $bb ]
  then
  break
  else
  echo "input wrong"
  fi
done

done
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP