技术标签: shell总结 shell总结(一)--Shell全局变量、环境变量和局部变
来自:http://c.biancheng.net/view/773.html
Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围)。
在不同的作用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同学,B 班也有个叫小明的同学,虽然他们都叫小明(对应于变量名),但是由于所在的班级(对应于作用域)不同,所以不会造成混乱。但是如果同一个班级中有两个叫小明的同学,就必须用类似于“大小明”、“小小明”这样的命名来区分他们。
Shell 变量的作用域可以分为三种:
所谓全局变量,就是指变量在当前的整个 Shell 会话中都有效。每个 Shell 会话都有自己的作用域,彼此之间互不影响。在 Shell 中定义的变量,默认就是全局变量。
想要实际演示全局变量在不同 Shell 会话中的互不相关性,可在图形界面下同时打开两个 Shell,或使用两个终端远程连接到服务器(SSH)。
首先打开一个 Shell 窗口,定义一个变量 a 并赋值为 1,然后打印,这时在同一个 Shell 窗口中是可正确打印变量 a 的值的。然后再打开一个新的 Shell 窗口,同样打印变量 a 的值,但结果却为空,如图 1 所示。
图1:打开两个 Shell 会话
这说明全局变量 a 仅仅在定义它的第一个 Shell 中有效,对其它 Shell 没有影响。这很好理解,就像小王家和小徐家都有一部电视机(变量名相同),但是同一时刻小王家和小徐家的电视中播放的节目可以是不同的(变量值不同)。
需要强调的是,全局变量的作用范围是当前的 Shell 会话,而不是当前的 Shell 脚本文件,它们是不同的概念。打开一个 Shell 窗口就创建了一个 Shell 会话,打开多个 Shell 窗口就创建了多个 Shell 会话,每个 Shell 会话都是独立的进程,拥有不同的进程 ID。在一个 Shell 会话中,可以执行多个 Shell 脚本文件,此时全局变量在这些脚本文件中都有效。
例如,现在有两个 Shell 脚本文件,分别是 a.sh 和 b.sh。a.sh 的代码如下:
#!/bin/bash
echo $a
b=200
b.sh 的代码如下:
#!/bin/bash
echo $b
打开一个 Shell 窗口,输入以下命令:
$ a=99
$ . ./a.sh
99
$ . b.sh
200
$
从输出结果可以发现,在 Shell 会话中以命令行的形式定义的变量 a,在 a.sh 中有效;在 a.sh 中定义的变量 b,在 b.sh 中也有效。
Shell 也支持自定义函数,但是 Shell 函数和 C/C++、Java 等其他编程语言函数的一个不同点就是:在 Shell 函数中定义的变量默认也是全局变量,它和在函数外部定义变量拥有一样的效果。请看下面的代码:
#!/bin/bash
#定义函数
function func(){
a=99
}
#调用函数
func
#输出函数内部的变量
echo $a
输出结果:
99
a 是在函数内部定义的,但是在函数外部也可以得到它的值,证明它的作用域是全局的,而不是仅限于函数内部。
要想变量的作用域仅限于函数内部,那么可以在定义时加上local
命令,此时该变量就成了局部变量。请看下面的代码:
#!/bin/bash
#定义函数
function func(){
local a=99
}
#调用函数
func
#输出函数内部的变量
echo $a
输出结果为空,表明变量 a 在函数外部无效,是一个局部变量。
Shell 变量的这个特性和 JavaScript 中的变量是类似的。在 JavaScript 函数内部定义的变量,默认也是全局变量,只有加上var
关键字,它才会变成局部变量。
全局变量只在当前 Shell 会话中有效,如果使用export
命令将它导出,那么它就在所有的子 Shell 中也有效了,这称为“环境变量”。
环境变量被创建时所处的 Shell 被称为父 Shell,如果在父 Shell 中再创建一个 Shell,则该 Shell 被称作子 Shell。当子 Shell 产生时,它会继承父 Shell 的环境变量为自己所用,所以说环境变量可从父 Shell 传给子 Shell。不难理解,环境变量还可以传递给孙 Shell。
注意,环境变量只能向下传递而不能向上传递,即“传子不传父”。
在一个 Shell 中创建子 Shell 最简单的方式是运行 bash 命令,如图 2 所示。
图2:进入子 Shell
通过exit
命令可以一层一层地退出 Shell。
下面演示一下环境变量的使用:
$ a=22 #定义一个全局变量
$ echo $a #在当前Shell中输出a,成功
22
$ bash #进入子Shell
$ echo $a #在子Shell中输出a,失败
$ exit #退出子Shell
exit
$ export a #将a导出为环境变量
$ bash #重新进入子Shell
$ echo $a #在子Shell中再次输出a,成功
22
$ exit #退出子Shell
exit
$ exit #退出父Shell,结束整个Shell会话
可以发现,默认情况下,a 在子 Shell 中是无效的;使用 export 将 a 导出为环境变量后,在子 Shell 中就可以使用了。export a
这种形式是在定义变量 a 以后再将它导出为环境变量,如果想在定义的同时导出为环境变量,可以写作export a=22
。
注意,本节我们一直强调的是环境变量在子 Shell 中有效,并没有说它在所有的 Shell 种有效;如果你通过终端创建一个新的 Shell,那么它就不是当前 Shell 的子 Shell,环境变量对这个 Shell 就是无效的。
此外,通过export
命令导出的环境变量是临时的,关闭 Shell 会话后它就销毁了。所以,这种环境变量也只是在局部范围内起作用,并不影响所有 Shell。
如果想让环境变量在所有 Shell 中都有效,并且能够永久保存,在关闭 Shell 后也不丢失,那么就需要把环境变量写入启动文件。至于如何写入文件,请大家自行百度,这里就不再赘述了。
转:http://2711082222.blog.163.com/blog/static/106302249201232622412171/?suggestedreading mTextView = (TextView)findViewById(R.id.myTextView); //创建一个 SpannableString对象 msp = new SpannableString("...
celery -A celery_tasks.tasks worker -l infoError:Unable to load celery application.The module goods was not found.)有人出现过这种情况吗?在redis都开了的情况下,还出现这样的问题
转载请标明原创:https://mp.csdn.net/console/editor/html/106304145传统经典的分布式集群处理服务器是一个集群,前端保留了某个固定的hash函数,每次都通过某个请求字段来hash后取模,判断需要到服务器集群中的哪台机器上处理。这样子,可以实现集群的负载均衡(因为hash函数得到的情况是均匀分布的)。但是当我要新增机器或者删除机器时,就需要重新计算哈希。(比如从3台增加到5台机器,前端的哈希取模就需要修改为5,同时原本3台机器中保存的数据,需要全部重.
#include <stdio.h>#include <stdlib.h>typedef struct{ char id[100]; char password[100];}Elemtype;struct LNode{ Elemtype data; struct LNode *next;};main(){ char a[]="Math Dash的链表程序",b[100]; sprintf(b,"title %s",a)...
设定特殊人群 产品薄利多销 冷门产品一般都会针对一些特殊人群而实质,所以想要打开这类人群的消费市场,首先要全面了解网购者的需求和产品的属性!产品定位做好后本着薄利多销的原则,在相应群组中进行推广,销售效果也会达到意想不到的效果! 寻找固定销售渠道 另一点极为重要的是根据产品特点徐招到固定的销售渠道,无论是给实体做批发还是自己找固定的客户,都要将每一个
jsp页面 公路行政级别: 路线编码: js代码$(function() { var _adminLevel = $('#adminLevel').combobox({ data :jsongl_xzjb, method :'get',
目标最近项目中需要对上传的本地视频和从其他服务器拷贝的视频进行校验功能,校验主要包括视频的时长,大小,格式等信息,那么如何获取这些信息呢?思路本地视频,从过文件流读取,再通过FFMpeg.exe获取到相关视频信息;网络视频,通过http下载到本地临时文件,在通过上述本地视频方法获取相关信息过程1.下载ffmpeg.exe,下载地址自行百度;2.将ffmpeg.exe...
IAR for mps430安装IAR5.1版本开发MSP430单片机,安装方法以及注意事项
问题描述:在Android Studio中创建Empty Activity应用程序,修改XML文件,使用ConstraintLayout实现如图所示登录页面;当用户输入用户名密码,点击登录按钮后,如果用户名非“AndroidUser”则使用Toast提示用户名错误,如果密码非“123456”,提示密码错误,否则,提示登录成功。老师布置的实验报告,让我用Android studio写了第一个小程...
1. 添加mysql配置文件Sangfor:EDS/eds-490a59b5 /etc/supervisor/conf.d # cat mysql_hive.conf[program:mysql]command=/usr/bin/mysqld_safe --basedir=/usruser=mysqlpriority=999autostart=trueautorestart=une...
有一些冷门的jar包,自己又比较懒,不想上传上nexus,就直接放web项目中的/WEB-INF/lib目录了,构建的时候,在编译期出错,因为无法依赖那些jar包,此时用maven的compile插件指定该目录为额外的库目录即可。 maven-compiler-plugin 1.7 1.7
Mysql的导入导出数据MySql 导入和导出数据导出数据将数据导出到输出文件将数据导出到转储文件导入数据使用MySQL实用程序使用mysqlimportMySql 导入和导出数据导出数据从mysql中导出数据到别的文件将数据导出到输出文件关键字into outfile将查询结果写入文本文件。 -- 标准语法 select (列) from (表) into outfile '文件url'; -- 例如将电影表的所有数据都存储在C盘下的MYSQL Server 8.0文件....中