忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 1326 | 回复: 4

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

论坛徽章:
2
辰龙
日期:2015-01-11 00:34:002015年亚洲杯之巴勒斯坦
日期:2015-01-28 10:35:37
发表于 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
复制代码


论坛徽章:
130
技术图书徽章
日期: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
发表于 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
发表于 2018-02-09 16:42 |显示全部楼层
人家问为什么!


这是变量的作用域问题,我为什么狂推powershell?
答:
if内部变量,在if外,能读写。
for内部变量,在for外,能读写。
foreach内部变量,在foreach外,能读写。
while内部变量,在while外,能读写。

scriptblock内部变量,在scriptblock外,能读写。
function内部变量,在function外,【不能!】读写。

论坛徽章:
2
辰龙
日期:2015-01-11 00:34:002015年亚洲杯之巴勒斯坦
日期:2015-01-28 10:35:37
发表于 2018-02-10 12:16 |显示全部楼层
本帖最后由 securitypluscn 于 2018-02-10 12:17 编辑

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


论坛徽章:
0
发表于 2018-02-10 16:33 |显示全部楼层
1 免费开源。

2问:目前哪些版本linux能安装上powershell?
答:
◦Windows 10 IoT Core(arm32的cpu,本质上是win,树莓派硬件上的win10)
◦Raspbian Stretch(arm32的cpu,树莓派官方操作系统Raspbian,基于大便,所以叫树莓便。)
◦MAC OS X 10.11
◦Ubuntu 14.04/16.04/17.10
◦Debian8.x/9.x
◦CentOS 7.x/RHEL 7.x/Fedora25/Fedora26/Fedora27
◦open SUSE 42及以上/SUSE Linux Enterprise Server 12 SP2
◦Docker。LINUX发行版中,安装容器dockerd,docker中运行powershell。
◦Arch Linux (archl inux 没有版本号)
◦Linux AppImage 容器(portable application single binary)  https://github.com/probonopd/AppImageKit
◦Kali Linux

安装方法:
https://github.com/PowerShell/Po ... stallation/linux.md

3 教程:
powershell脚本第一课:面向对象简介1
http://bbs.chinaunix.net/thread-4263988-1-1.html


ps第二课:常用对象类型
http://bbs.chinaunix.net/thread-4264061-1-1.html



ps第三课:面向对象语言有啥优缺点?
http://bbs.chinaunix.net/thread-4264062-1-1.html



ps第4课:文件目录对象介绍
http://bbs.chinaunix.net/thread-4264293-1-1.html


ps第5课:常用帮助命令
http://bbs.chinaunix.net/thread-4264294-1-1.html


ps第6课:单个字符对象,讲ps如何处理单个字符,含汉字
http://bbs.chinaunix.net/thread-4264556-1-3.html


ps第7课:powershell到底有何优势,为什么要学?
http://bbs.chinaunix.net/thread-4264776-1-1.html


ps第8课:用powershell读写文本、二进制文件。
http://bbs.chinaunix.net/thread-4266404-1-1.html



ps第9课:powershell数组(静态,动态)
http://bbs.chinaunix.net/thread-4267455-1-1.html



ps第10课:powershell中有,世界上最好的脚本编码处理技术
http://bbs.chinaunix.net/thread-4291318-1-1.html

--------------------------------------------------------
字符界面版,powershell2048游戏。win_linux_通用
http://bbs.chinaunix.net/thread-4260709-1-1.html



跨平台ps命令行游戏:《抽一张扑克牌比大小.ps1》
http://bbs.chinaunix.net/thread-4266193-1-1.html



powershell学习:在命令行中输出,各种款式,带颜色的表(format-table)
http://bbs.chinaunix.net/thread-4289803-1-1.html



【摩斯密码】加密,解密脚本。---无间道,使徒行者,必用!
http://bbs.chinaunix.net/thread-4267658-1-3.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP