免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: GM
打印 上一主题 下一主题

红袖添香:续问.......!!!!! [复制链接]

论坛徽章:
0
61 [报告]
发表于 2003-03-06 13:10 |只看该作者

红袖添香:续问.......!!!!!

原帖由 "laoxia" 发表:
grep  -w   "isql"  filename

谢谢,老虾,呵呵!!
红袖好:
echo "awk '{print \$""$col}' $file"|sh

能不能用sed写,呵呵,我也想学习sed的方法。
还有我这个程序实现的功能,还有更加好的方法吗?

论坛徽章:
0
62 [报告]
发表于 2003-03-07 07:56 |只看该作者

红袖添香:续问.......!!!!!

红袖好:
我这个人真粗心啊,把这个给贴错了(echo "awk '{print \$""$col}' $file"|sh),使你看不懂对不起啊!,我是要引用下面这个问题的,呵呵!!!
cmd=`echo $jc|awk '{print $1}'`
gn=`echo $jc|awk '{print $2}'`
能不能用sed写,呵呵,我也想学习sed的方法。
还有我这个进程判断程序实现的功能,还有更加好的方法吗?

论坛徽章:
0
63 [报告]
发表于 2003-03-07 08:17 |只看该作者

红袖添香:续问.......!!!!!

不知道红袖姐是不是有办法,但偶查了半天书,也没发现sed能够处理像GM兄说的那种情况!

偶知道偶很笨的说·!

论坛徽章:
0
64 [报告]
发表于 2003-03-08 00:14 |只看该作者

红袖添香:续问.......!!!!!

原帖由 "nmgzw" 发表:
不知道红袖姐是不是有办法,但偶查了半天书,也没发现sed能够处理像GM兄说的那种情况!

偶知道偶很笨的说·!
...

可以是可以的,但是比 awk 可麻烦多了,好象没有必要,

让我看一下,,,

论坛徽章:
0
65 [报告]
发表于 2003-03-08 00:25 |只看该作者

红袖添香:续问.......!!!!!

...


  1. ...
  2. while read jc; do
  3.     cmd=`echo $jc| sed -e 's/\ .*$//g '`
  4.     gn=`echo $jc| sed -e 's/^[^ ]*\ //g'`
  5.     ...
  6. done < jc.txt
复制代码

论坛徽章:
0
66 [报告]
发表于 2003-03-08 21:14 |只看该作者

红袖添香:续问.......!!!!!

红袖好:
节日快乐,今天你的回贴很多啊,忙了好一陈吧!你sed用得很妙啊,我觉得awk要比sed好用的多,sed用法看得我很玄,真要找本书好好学习一下啊。
今天,我又新生一个问题要向你请教啊!


  1. echo "......................继续要执行吗?...............[y/n]"
  2. read aaa
  3. if [ "$aaa" != "y" ]
  4.    then
  5.    /usr/out/as/程序一
  6.    /usr/out/as/程序二
  7.    .........
  8.    echo "...................您已安全终止此程序的执行........"
  9.    return
  10. fi
复制代码

这个判断一看就知道,除“y”字母外,其它字母不光是"n"字母也会造成程序的退出,所以这样判断是不完善,不科学的。
如要做成只能接受"y"和"n"字母的判断也并不难,但要做到以下几点对我来讲有点难了:
难点一:由于这个shell是个多命令的集合,象这类判断有好多处,所以要把这段代码要做成函数形式,使之能方便地调用。
难点二:这个判断中/usr/out/as/程序一,/usr/out/as/程序二,.......是个可变的,有可能要执行几条命令退出,也有可能没有命令直接退出,所以要以参数的方式传入函数中去,使之能灵活地运用。

红袖你说能达到这种功能吗?我这个人问题特多,但问的比较实用,谢谢你的帮助!!!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
67 [报告]
发表于 2003-03-09 08:25 |只看该作者

红袖添香:续问.......!!!!!

巾帼不让须眉呀。

论坛徽章:
0
68 [报告]
发表于 2003-03-10 07:01 |只看该作者

红袖添香:续问.......!!!!!

...

谢谢夸奖哦~~  

GM,你需要的用来处理回答(yes/no)的问题,已经做成子函数 yesno() ,本来是挺简单的,不过你还希望调用的命令能够不确定数目的多个,所以就用了个 cmd() 来处理一下。

下次在你自己的程序中用时,只要直接调用就好了。

yesno "提示字符串[y/n]"  -c 命令1, 命令2, 命令3, ……  (命令可以包含空格,但命令之间必须用逗号作分隔符)

或者把所有的命令行都放到一个文本文件中去,一个命令一行,然后调用

yesno "提示字符串[y/n]" -f 命令文件


当然,你还可以修改得更好点,以适应你的要求。

  1. #!/bin/sh

  2. # cmd() subroutine excutes commands
  3. cmd() {
  4.     case $1 in
  5.     -c)  if [ ! $2 ]; then
  6.                echo "-c : -c COMMAND LIST"
  7.                exit 1
  8.          else
  9.                shift
  10.                echo $* | awk -F, 'BEGIN{i=0} { while ( i++ < NF ) print $i}'| while read cmd; do
  11.                     echo "--------------- excute command $cmd ---------------"
  12.                     $cmd
  13.                done
  14.          fi
  15.          ;;
  16.     -f)  if [ ! $2 ]; then
  17.                echo "-f : -f FILE"
  18.                exit 1
  19.          else
  20.                while read cmd; do
  21.                     echo "--------------- excute command $cmd ---------------"
  22.                     $cmd
  23.                done < $2
  24.          fi
  25.          ;;
  26.     esac
  27. }

  28. # yesno() subroutine handles user's input
  29. yesno() {
  30.     printf "$1 "
  31.     while read reply; do
  32.         case $reply in
  33.            y|Y) shift
  34.                 cmd $*
  35.                 break;;
  36.            n|N) echo "OK. stop."
  37.                 break;;
  38.              *) printf "You should type \"y\" or \"n\" [y/n] "  
  39.                 continue ;;
  40.         esac
  41.     done
  42. }

  43. # example 1

  44. REQ="example1: continue~~~~~~~~~~~[y/n]"

  45. yesno "$REQ" -c ls *.sh, tail /var/log/messages, df -h

  46. # example 2

  47. REQ="example2: _________continue_______[y/n]"

  48. yesno "$REQ" -f cmd.txt
复制代码

论坛徽章:
0
69 [报告]
发表于 2003-03-10 14:53 |只看该作者

红袖添香:续问.......!!!!!

红袖好:
写的精华啊,精华,谢谢你的无私奉献,真的要感谢你帮助了我!!!
有一点,上次我没叙述明白:
就是:
如果我要在程序中判断备份是否成功,如备份不成功时则打“n"时,下面的程序不能再处理了,要达到退出整个shell程序时,是不是把break换成exit,并且退出时还要删刚才备份的数据!
是不是要改成这样:


  1. # yesno() subroutine handles user's input
  2. yesno() {
  3.     printf "$1 "
  4.     while read reply; do
  5.         case $reply in
  6.            y|Y) break;;
  7.            n|N) shift
  8.                 cmd $*
  9.                 exit;;
  10.              *) printf "You should type \"y\" or \"n\" [y/n] "  
  11.                 continue ;;
  12.         esac
  13.     done
  14. }

复制代码

yesno "备份成功吗..........[y/n]" -c rm -r /out/backup


问:1,但我上次前面的简单的判断中return为什么可以退出,而这儿一定要用exit才能退出呢?用这个exit正确吗?
2,象这种情况,程序中也有可能会出现,一定要退出整个程序后,以便查正后再重新做,但退出后,要执行一些恢复命令,所以和你所列的判断正好相反,是不是要做成不同的函数?能不能用识别参数做在同一个函数中呢?

论坛徽章:
0
70 [报告]
发表于 2003-03-10 23:11 |只看该作者

红袖添香:续问.......!!!!!

...


1、我想那是因为你的那段程序是在主程序段中,而现在是在yesno()的子程序段中,return就跳回原来呼叫的地方,而exit则是退出。

2、稍微修改了一下,加上个 -r 表示相反(reverse),不想做大的改动了,所以这个参数要求为第二个,第一个为yesno字串,p这两个参数后面的其它参数的是照例,一系列命令。其效果就是,当第二个参数为 -r 时,就表示回答 n 时执行 -c 或 -f 中的命令,如果没有这个参数,则为回答 y 时执行其后面的命令。不知道这样子有没有解决你的问题?



  1. # yesno() subroutine handles user's input
  2. yesno() {
  3.   printf "$1 "
  4.   while read reply; do
  5.     case $reply in
  6.       y|Y)
  7.         if [ "x$2" != "x-r"  ]; then          #### modified
  8.             shift
  9.             cmd $*
  10.         fi
  11.         break;;
  12.       n|N)
  13.         if [ "x$2" = "x-r"  ]; then           #### modified
  14.             shift 2
  15.             cmd $*
  16.         fi
  17.         break;;
  18.        *) printf "You should type \"y\" or \"n\" [y/n] "
  19.         continue ;;
  20.     esac
  21.   done
  22. }
复制代码


调用的时候也很简单,加上一个参数 -r
# example 1

REQ="example1: continue~~~~~~~~~~~[y/n]"

# yesno "$REQ" -c ls *.sh, tail /var/log/messages, df -h
yesno "$REQ" -r -c ls *.sh, tail /var/log/messages, df -h

# example 2

REQ="example2: _________continue_______[y/n]"

# yesno "$REQ" -f cmd.txt
yesno "$REQ" -r -f cmd.txt
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP