免费注册 查看新帖 |

Chinaunix

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

[系统管理] shell 循环命令+变量的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-11 23:41 |只看该作者 |倒序浏览
本帖最后由 p0w3r 于 2014-03-12 21:06 编辑


03/12 更新

  1. IP=$(ifconfig eth0.2 | grep 'inet addr:' | grep Bcast | awk '{print $2}' | awk -F: '{print $2}')
  2. mentps=$(ps | grep mentohust | grep -v grep | awk '{print $1}')

  3. if [ $IP ] && [ -n "$mentps" ] ; then
  4.   ping -c 2 10.21.110.254                            #> /dev/null
  5.   RET=$?                                                   #&& echo $RET && sleep 2
  6.    
  7.   while [ $RET -eq 1 ]
  8.   do
  9.     echo "Running mentohust" && mentohust -k && mentohust && sleep 2
  10.     ping -c 2 10.21.110.254 > /dev/null
  11.     RET=$?
  12.         done
  13.         else                                                                                                           # [ $RET = 0 ] ; then
  14.         echo " Mentohust Run !  "
  15. fi     
复制代码
上面这个代码我看不出问题了. 各位大侠指点一下.

我的用途是 如果网卡有获取IP , 然后没有mentohust这个进程的话就执行下面的命令 (貌似说废话了)

之后通过ping 看网卡是否ping通 , 如果不通就获取$? 的值 ,如果是 "1 " 就执行循环 .
然后 如果 $? 的值是 " 0 " 的话说明已经通了 就结束.



现在问题是 运行了脚本之后,  没信息返回 .




===========================分割===================================
  1. ret=$?
  2. if [ $IP ] && [ -n $mentps ] ; then
  3.   ping -c 2 10.21.110.254 > /dev/null
  4.   until (($ret))
  5.   do
  6.     [ $ret -eq 0 ] && (mentohust -k) && mentohust
  7.     ping -c 2 10.21.110.254 > /dev/null
  8.         done
  9.   else
  10.   echo " Not getting an IP via DHCP ! "
  11. fi

  12. WebTEST=$(curl -s baidu.com | grep "219.136.125.139")

  13. if [ -n $WebTEST ] ; then
  14.     WebAuth
  15.    
  16.     fi
复制代码
我是打算通过 ping 是否成功所输出的 $? 来判断是否同问是畅通的. 如果ping 不通会返回 1  .然后循环. 但是貌似 until 后面跟的 变量貌似不行 .一直都在循环

论坛徽章:
0
2 [报告]
发表于 2014-03-12 06:04 |只看该作者
回复 1# p0w3r
ret的定义太早了,ret=$?至少放在ping下面
   

论坛徽章:
2
水瓶座
日期:2014-02-28 14:20:09辰龙
日期:2014-06-16 13:18:51
3 [报告]
发表于 2014-03-12 09:31 |只看该作者
每次ping完之后都需要重新给ret赋值

论坛徽章:
0
4 [报告]
发表于 2014-03-12 10:54 |只看该作者
回复 2# runintostar


    原来这样.  那么. 我 until 后面跟的这个条件测试可行么?

论坛徽章:
0
5 [报告]
发表于 2014-03-12 11:05 |只看该作者
回复 4# p0w3r

你要根据三楼说的改,每个ping之后都要保存$?的值
  1. ret=$?
  2. if [ $IP ] && [ -n $mentps ] ; then
  3.   ping -c 2 10.21.110.254 > /dev/null
  4.   ret=$?##added
  5.   until (($ret))
  6.   do
  7.     [ $ret -eq 0 ] && (mentohust -k) && mentohust
  8.     ping -c 2 10.21.110.254 > /dev/null
  9.         ret=$?
  10.         done
  11.   else
  12.   echo " Not getting an IP via DHCP ! "
  13. fi

  14. WebTEST=$(curl -s baidu.com | grep "219.136.125.139")

  15. if [ -n $WebTEST ] ; then
  16.     WebAuth
  17.    
  18.     fi
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-03-12 11:38 |只看该作者
回复 5# runintostar


    用了这个代码. 发现 在一开始赋值给RET了. RET已经是0 了但是until 循环还是会执行下去的

论坛徽章:
0
7 [报告]
发表于 2014-03-12 11:54 |只看该作者
本帖最后由 runintostar 于 2014-03-12 12:05 编辑

回复 6# p0w3r

until之前有ping的啊,所以一开始赋的值就没了。
另外刚才我注释的时候#连上$?了,会报错,你把注释去掉
   
另外一般不用(())这个判断,刚才试了下
until(($ret))这个当$ret=0的时候会认为判断失败,就进去循环,当$ret=1的时候才成功

写shell写到现在,还是那几点,希望自己的代码通用性强。
取命令结果尽量用``, 别用$()
expression判断尽量用[], 别用[[]]和(())

论坛徽章:
0
8 [报告]
发表于 2014-03-12 12:06 |只看该作者
回复 7# runintostar


    这个#号后面的我已经去掉了的.
    但是现在问题就是 ret=0的时候他就进去循环了. until 这个不是 判断1 才进入循环 .0 就不执行循环的么?
还有你说的 不用 (()) 做判断哪应该用什么做判断

论坛徽章:
0
9 [报告]
发表于 2014-03-12 12:13 |只看该作者
回复 8# p0w3r

(($ret))这个是在$ret=1的时候为真的,而你是想让$ret=0的时候为真。

你希望$ret=0就不循环$ret=1就进入循环,就直接写成下面这样
  1. until [ $ret -eq 0 ]
  2. do
  3. done
复制代码

论坛徽章:
0
10 [报告]
发表于 2014-03-12 12:37 |只看该作者
回复 9# runintostar


    嗯. 我试试. 之前是打算用while 循环的. 但是看了一下while 是返回  0 嘚话就执行 .而until 是相反.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP