免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1883 | 回复: 4

[学习共享] ps第14课:讲ps,bash,变量的作用域 [复制链接]

论坛徽章:
0
发表于 2018-12-03 13:44 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2018-12-04 13:14 编辑





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



ps第11课:尽解powershell哈希表
http://bbs.chinaunix.net/thread-4296512-1-1.html


ps第12课:如何用ps,bash编写远程脚本
http://bbs.chinaunix.net/thread-4298680-1-2.html


ps第13课:单步、断点、图形界面,ps极大提升了linux脚本生产力
http://bbs.chinaunix.net/thread-4299559-1-2.html



论坛徽章:
0
发表于 2018-12-03 13:45 |显示全部楼层
前人写过 shell 十三问,被奉为shell经典。但是我也写出了ps13课呀。这就是第14课。以后请叫我ps脚本教头,嘎嘎。


ps第14课:变量的作用域

-------------------------------------------------------【概述】-------------------------------------------------------

微软为啥要发明多线程脚本?而不是像bash那样用多进程?
你为啥要学用多线程脚本,抛弃多进程?


当人死后,尸体将被运往火葬场,烧剩钙,然后拉去化肥厂做化肥。名曰资源回收再利用。

.net的垃圾回收也是如此。都是简单的东西,今天我就讲讲这个:
.net并不是立即销毁【已经无用的变量】即【变量尸体】,而是在cpu空闲,或者内存紧张的时候。或者是进程退出等某些关键点。总之有自己的逻辑。


-------------------------------------------------------【powershell的变量的作用域】-------------------------------------------------------
$global:                        变量的【全局】作用域,位于$script外部。位于powershell.exe内部,所以也可以叫做进程内最大的作用域。一般用于多线程,多脚本公用变量。
$script:                        变量的【脚本】作用域,xxx.ps1脚本内部,在脚本外部无法访问。一旦脚本执行完成,或中途经exit 1等数字退出后,【$script:yyy】这个xxx.ps1中所有的变量,就都没用了,将变成【尸体变量】交给垃圾回收。
$local:                                变量的【本地】作用域,可以用在比【$script:】小,但比【$private:】大。可以有多个local作用域。
$private:                        变量的【私有】作用域,位于函数,workflow内部。在函数,workflow外无法读写。
编号作用域:                0表示当前,1表示父。2表示爷,以此类推。

环境变量 > 全局 > 脚本 > 本地 > 本地 > 本地 > 函数,类,私有

打开powershell.exe窗口,输入$a=123,即可写入$global:a。

1只有三个圈作为隔离:全局,脚本,函数。
2外圈变量,内圈可读。
3内圈变量,外圈不可读。
4只有函数定义私有变量才有意义。函数私有变量,子函数不可读。函数默认定义$local:        级别变量。
在函数中,定义变量abc,用$abc即可。不用特意用$local:abc。
在函数外,是无法访问这个$abc的。


if内部变量,在if外,能读写。
for内部变量,在for外,能读写。 powershell 传教士 原创 教程 2014-06-20
foreach内部变量,在foreach外,能读写。
while内部变量,在while外,能读写。

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

代码也是一样。scriptblock,function,默认属于【当前线程作用域内】,后台线程如果想访问,应该把它俩放入全局作用域。


划出大圈小圈($global,$script)等,合理摆放变量。
变量用完后,把变量死尸送往火葬场,让【。net垃圾回收】再分配,再利用,旧瓶装新酒,你学会了吗?


-------------------------------------------------------【bash 的变量作用域】-------------------------------------------------------
bash没有多线程,也就【没有ps的$global:变量作用域】。即:
环境变量 > 脚本 > 本地。多脚本共享变量时值,特别依赖环境变量。
但是环境变量有它自己的限制,值不能太大,不能太多,类型也受限,没有数组哈希表等。
实际上不管任何语言,2个进程之间共享变量,都麻烦。


另外 while内部变量,在while外,无法读写。这是一个跟其他语言不同的,特别好!的特色。

显式定义、销毁,比ps麻烦一点点。可以忽略不计。



----【课后作业】----

传教士旁白:这个课后作业考核的是,世界上为啥要有多线程?微软为啥要发明多线程脚本?为啥要有json。

问:
设环境为win10 + ps5.1
两个【本地】powershell.exe 如何传递 【对象】?
比如说第一个powershell.exe中,产生一个时间对象,$a = get-date
然后传递给第二个powershell.exe中,把时间加一分钟,再传回到第一个powershell.exe中。


----【课后作业答案】----
答案正在编写中。先吊你胃口。

论坛徽章:
0
发表于 2018-12-06 16:34 |显示全部楼层
----【课后作业答案】----
1 本质上两个【本地】powershell.exe,或两个pwsh,无法传递【对象类型变量】,只能传递字符串(数值也是字符串),
所以说我们应该尽量用多线程。因为任何语言,线程之间可以传递【对象类型变量】。

2 两个进程之间,想传递类型,必须要经过【序列化/反序列化】。对于java就是json。而.net有多种序列化/序列化方法,性能各不相同。

3 本地powershell和远程powershell,可以直接传递【对象类型变量】。这里面含有(不需要告人的)【序列化/反序列化】过程。具体而言,

3.1 win客户机和win2012(及以上)可以远程直接传递对象。

3.2 win,linux之间的powershell互联,两个linux版powershell互联,可以传递【对象类型变量】。
这要求设定sshd_config的subsystem 为powershell。因为必须两个powershell互联,而不是powershell和bash互联。

3.3 两个【本地powershell.exe】通过隐式远程处理,可以传递【对象类型变量】。含win,linux,mac。
$s = New-PSSession -ComputerName 127.0.0.1  #需要本地开启win,linux,mac 远程。
$d = invoke-command -Session $s -ScriptBlock {get-date}
$d.gettype()

问:3.3节中,本地两个powershell进程之间传值,竟然依赖远程功能?
答:那没法子,谁让对象序列化/反序列化是自动的呢。


结论:
强类型变量功能强,更严谨。【对象类型变量】或者叫做【强类型变量】是必须的。
bat,bash,javaScript 不支持强类型。js快被其衍生版微软TypeScript蚕食大半了。
从php7开始,php的强类型变量也多,更规范了。
所以说强类型变量的powershell蚕食bash,是对的。代表了软件的进步。



两个进程之间传递【对象类型变量】java也无法实现!
所以说要么你用多线程。要么你用【序列化/反序列化】。
对于脚本来说,你可以用ps多线程,ps远程,实现n个进程之间的传值。

论坛徽章:
0
发表于 2019-03-17 15:22 |显示全部楼层
函数作用域:

  1. function global:函数名
  2. {
  3.         param
  4.         (
  5.                 $参数1
  6.         )
  7.         write-host "问:在同一个ps进程中,如何让两个脚本公用某函数?"
  8.         write-host "答:在脚本中定义【global:函数名】即可"
  9.         write-host "使用:  global:函数名  -参数1  $值1    "
  10. }
复制代码

论坛徽章:
15
2015年迎新春徽章
日期:2015-03-04 09:57:09操作系统版块每日发帖之星
日期:2016-08-10 06:20:00操作系统版块每日发帖之星
日期:2016-07-16 06:20:00操作系统版块每日发帖之星
日期:2016-06-04 06:20:00操作系统版块每日发帖之星
日期:2016-03-14 06:20:00操作系统版块每日发帖之星
日期:2016-01-20 06:20:00操作系统版块每日发帖之星
日期:2015-12-23 06:20:00操作系统版块每日发帖之星
日期:2015-11-04 06:20:00每日论坛发贴之星
日期:2015-10-21 06:20:00操作系统版块每日发帖之星
日期:2015-10-21 06:20:00操作系统版块每日发帖之星
日期:2015-10-18 06:20:00操作系统版块每日发帖之星
日期:2015-07-13 23:17:29
发表于 2019-03-18 16:25 |显示全部楼层
hahaha

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP