免费注册 查看新帖 |

Chinaunix

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

[系统管理] 看不到函数内容 [复制链接]

论坛徽章:
2
辰龙
日期:2015-01-11 00:34:002015年亚洲杯之巴勒斯坦
日期:2015-01-28 10:35:37
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-02-09 07:53 |只看该作者 |倒序浏览
我在写一个程序以便回收不需要的虚拟机,其中一段编码如下:


  1. if [[ $# -eq 0 ]]; then
  2.   while :; do
  3.      $vsh list --all
  4.      read -p "Please enter the VM name to kill: " vm
  5.               $vsh list --all | while read i; do
  6.               i=$(echo $i | awk '{print $2}')
  7.               if [[ "$i" == "$vm" ]]; then
  8.                      echo ${img_path}$vm
  9.                      #$vsh destroy $vm
  10.                      #$vsh undefine $vm
  11.                     #rm -rf ${img_path}$vm
  12. <font color="#ff0000">                    found=y       </font>
  13.                    echo \$found1: $found
  14.                    break
  15.               fi
  16.             done
  17.      echo "\$found2: $found"
  18.     if [[ <font color="#ff0000">"$found" != y</font> ]]; then
  19.       echo "$vm not found"
  20.        exit 3
  21.     else
  22.        exit 0
  23.     fi
  24. done
复制代码
我的问题是我设置的函数为什么在循环之外看不到结果?请见测试输出如下, 多谢!


  1. + img_path=/var/lib/libvirt/images/
  2. ++ which virsh
  3. + vsh=/usr/bin/virsh
  4. ++ id -u
  5. + uid=0
  6. + [[ 0 != 0 ]]
  7. + [[ 0 -gt 1 ]]
  8. + [[ 0 -eq 0 ]]
  9. + :
  10. + /usr/bin/virsh list --all
  11. Id    Name                           State
  12. ----------------------------------------------------
  13. -     httpd                          shut off
  14. -     TE                             shut off

  15. + read -p 'Please enter the VM name to kill: ' vm
  16. Please enter the VM name to kill: httpd
  17. + /usr/bin/virsh list --all
  18. + read i
  19. ++ echo Id Name State
  20. ++ awk '{print $2}'
  21. + i=Name
  22. + [[ Name == \h\t\t\p\d ]]
  23. + read i
  24. ++ echo ----------------------------------------------------
  25. ++ awk '{print $2}'
  26. + i=
  27. + [[ '' == \h\t\t\p\d ]]
  28. + read i
  29. ++ echo - httpd shut off
  30. ++ awk '{print $2}'
  31. + i=httpd
  32. + [[ httpd == \h\t\t\p\d ]]
  33. + echo /var/lib/libvirt/images/httpd
  34. /var/lib/libvirt/images/httpd
  35. <font color="#ff0000">+ found=y                             <--------------OK</font>
  36. + echo '$found1:' y
  37. $found1: y
  38. + break
  39. + echo '$found2: '
  40. <font color="#ff0000">$found2:                              <---------------Not OK</font>
  41. <font color="#ff0000">+ [[ '' != y ]]     </font>            <font color="#ff0000">       <---------------Not OK</font>
  42. + echo 'httpd not found'
  43. httpd not found
  44. + exit 3
复制代码


论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2018-02-09 15:40 |只看该作者
回复 1# securitypluscn

while change to for

$ echo 1 | while read n; do echo "inside:$n";done; echo "outside:$n"
inside:1
outside:

$ while read n; do echo "inside:$n"; done <<< 1; echo "outside:$n"
inside:1
outside:

$ for n in 1; do echo "inside:$n"; done; echo "outside:$n"
inside:1
outside:1

论坛徽章:
0
3 [报告]
发表于 2018-02-09 16:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
辰龙
日期:2015-01-11 00:34:002015年亚洲杯之巴勒斯坦
日期:2015-01-28 10:35:37
4 [报告]
发表于 2018-02-10 12:16 |只看该作者
本帖最后由 securitypluscn 于 2018-02-10 12:17 编辑

谢谢二位指点。按二位提供的思路,我又GOOGLE 了一下。原来PIPE命令会产生一个SUBSHELL。所以在原SHELL看不到SUBSHELL的函数内容。这个连接详细解释了原因和解决方法。
顺便问一下楼上这位推销窗户的老兄。你这窗户怎么个卖法?


论坛徽章:
0
5 [报告]
发表于 2018-02-10 16:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP