Shell全局变量、局部变量与特殊变量笔记总结

原文:http://blog.csdn.net/apollon_krj/article/details/70148022

变量类型:全局变量(环境变量)和局部变量(本地变量) 
环境变量可以在定义它们的shell及其派生出来的任意子进程的shell中使用。局部变量只能在定义它们的函数/脚本中使用。还有一些变量是用户创建的,其他的则是专用的shell变量。

1、全局变量(环境变量):

环境变量可用于定义shell的运行环境,环境变量可以在配置文件中定义与修改,也可以在命令行中设置,但是命令行中的修改操作在终端重启时就会丢失,因此最好在配置文件中修改(用户家目录的“.bash_profile“文件或者全局配置“/etc/profile”、“/etc/bashrc”文件或者“/etc/profile.d”文件中定义。)将环境变量放在profile文件中,每次用户登录时这些变量值将被初始化。比如HOME、USER、SHELL、UID等再用户登录之前就已经被/bin/login程序设置好了。

常见系统环境变量:

TMOUT:设置自动退出的误操作等待时间 
HOSTTYPE:系统文件系统类型 
HISTSIZE:历史命令记录条数 
HOME:用户登录时进入的目录,家目录 
UID:当前用户的id 
SHELL:当前shell解释器 
PWD:当前所在路径(每改变一次目录,该值就会改变) 
PATH:可执行文件默认路径 
等等。

可以用echo来显示查看全局变量(eg:echo $HOME)。env(或printenv)、set也可以用来查看系统的环境变量,但不是单独查看。而用unset临时取消环境变量(eg:unset USER),要永久生效还是要写到配置文件中

自定义环境变量(采用export): 
①export 变量名=value 
②变量名=value;export 变量名 
③declare -x 变量名=value 
这里依旧是临时生效,在shell终端关闭后就消失了,写到配置文件中则永久生效(注意:写到配置文件中后需要运行一遍配置文件的脚本才可生效,否则等重启时生效)

命令行的三种方式测试如下: 

关于环境变量PATH与export的更详细的内容,可参考:Linux环境变量与系统编程学习笔记

2、局部变量(本地变量):

本地变量在用户当前的shell生存期的脚本中使用。在一个函数中将某个变量声明为local,则该变量就是一个局部变量,只在本函数中有效。 
定义:

变量名=value 
变量名=’value’ 
变量名=”value” 
shell中变量名的要求:一般遵循字母、数字、下滑线组成,不能以数字开头

eg:以下脚本执行后(交互式非交互式都可以测试)输出什么(c与{c}等同)?

a=192.168.1.1
b='192.168.1.2'
c="192.168.1.3"
echo "A=$a"
echo "B=$b"
echo "C=${c}"
a=192.168.1.1-$b
b='192.168.1.2-$b'
c="192.168.1.3-$b"
echo "A=$a"
echo "B=$b"
echo "C=${c}"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

输出结果如下:

A=192.168.1.1
B=192.168.1.2
C=192.168.1.3
A=192.168.1.1-192.168.1.2
B=192.168.1.2-$b
C=192.168.1.3-192.168.1.2-$b
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

总结分析: 
单引号与双引号的区别在于:单引号内若存在变量,存在的变量当做字符串不会被解析,原样输出;而双引号中若存在变量,该变量会被解析出其具体的值再加入到字符串中。①不加引号可以直接定义内容包含数字、字符串、路径名等,适合定义数字②单引号适合于纯定义字符串,③而双引号适合于字符串的内容中包含有变量的内容的定义。(习惯:数字以及不带空格的简单字符串不加引号,其它长的特别是有空格的字符串加双引号;遇到“$变量名”,但不想解析的加单引号,但一般出现$都是为了解析变量,所以单引号较少使用)

注意:单引号与双引号的特点不具有普遍性,如下: 
在普通shell中:

ETT=123
echo '$ETT' //打印$ETT(单引号不解析)
echo "$ETT" //打印123(双引号解析)
  • 1
  • 2
  • 3

而在awk中调用shell变量:

awk 'BEGIN {print '$ETT'}'//打印123(单引号解析)
awk 'BEGIN {print "$ETT"}'//打印$ETT(双引号不解析)
  • 1
  • 2

虽然在awk中不具有普遍性,但是在普通Shell中还是具有普遍性的。

3、关于局部变量的其它一些问题

①用反引号将命令的结果作为变量名是常用的方法,eg:cmd=`date +%F`
②用$符号将命令的结果作为变量名也比较常用,eg:cmd=$(date +%F)
③变量在大括号上的使用:在以时间、主机名等为包名一部分来打包的时候常用
  • 1
  • 2
  • 3

eg1:用时间作为文件名的一部分打包

cmd=$(date +%F)    //由于`date +%F`的反引号不容易辨认,就不太使用`date +%F`
tar -zcf code_$(date+ %F)_kang.tar.gz /etc //没有问题
tar -zcf code_`date +%F`_kang.tar.gz /etc //没有问题
tar -zcf code_kang_$cmd.tar.gz /etc //没有问题
tar -zcf code_$cmd_kang.tar.gz /etc //会有歧义,因为系统会不清楚是应该解析$cmd还是cmd_kang
tar -zcf code_${cmd}_kang.tar.gz /etc //不会有歧义
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对后两种测试结果如下(不加{}的与理想结果是不符的): 
 
eg2:用主机名与时间打包

cmd=$(date +%F)
host=$(hostname)
tar -zcf code_${cmd}_${host}.tar.gz /etc
  • 1
  • 2
  • 3

测试: 
 
养成将字符串括起来使用的习惯防止不易发现的错误。

4、Shell的特殊变量:

$0:获取当前执行的shell脚本的文件名(执行时给定的是完整路径则获取到的也是完整路径)
  • 1

两个命令与$0的组合测试:获取一个带路径的文件的路径名与文件名两部分

dirname(获取目录名部分)
basename(获取文件名部分)
  • 1
  • 2

测试: 

$n:获取当前执行的shell脚本的第n个参数,如果n=0则获取的是脚本的文件名。如果n>9则需要用大括号括起来,eg:${21}
  • 1

测试$n:

$*:获取当前执行的shell的所有参数,将所有的命令行参数视为单个字符串
$#:获取当前shell命令行中参数的总个数
$@:这个程序的所有参数"$1" "$2" "$3" "...",这是将参数传递给其它程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白 $*与$@的区别:
$*将命令行的所有参数视为一个字符串:"$1$2$3..."
$@将命令行的每个参数视为单个的字符串:"$1" "$2" "$3" ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

基本测试如下: 

获取状态变量:
$$:获取当前的shell进程号
$?:获取执行上一个指令的返回值(0为成功,非零为失败),可以对上一个命令执行是否成功进行判断。
$_:在此之前执行的命令或脚本的最后一个参数
  • 1
  • 2
  • 3
  • 4

$?变量其实获取的是上一个程序返回给父进程shell的返回值(该值在0-255之间:0表示运行成功,2表示权限拒绝,1~125为运行失败原因是脚本命令、系统命令错误或参数传递错误,126为找到该命令但是无法执行,127为无该命令/程序,>128表示命令被系统强制结束)

$?的不同返回值测试: 
 
$?的值范围测试如下:

$?在脚本中的应用: 
常用来判断上一步是否成功(压缩失败打印ERROR压缩成功打印OK): 

(转)Shell全局变量、局部变量与特殊变量笔记总结的更多相关文章

  1. 【学习笔记】Shell-1 变量:命名规范、变量赋值/取值/取消、局部变量/全局变量、预设环境变量

    1.Shell变量 从变量的实质上来说,变量名是指向一片用于存储数据的内存空间. Shell变量是一种弱类型的变量,即声明变量时不需要指定其变量类型,也不需求遵循“先声明再使用”的规定,想用即可用. ...

  2. Shell 全局变量、环境变量和局部变量

    Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围). 在不同的作用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同学,B 班也有个叫小明的同学,虽然他 ...

  3. Shell变量的作用域:Shell全局变量、环境变量和局部变量

    Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围). 在不同的作用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同学,B 班也有个叫小明的同学,虽然他 ...

  4. shell编程学习笔记(三):Shell中局部变量的使用

    现在我们看一下Shell中局部变量的使用 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/scripts # vim script03.sh 开始编写script0 ...

  5. C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序 ...

  6. C++ 局部静态变量,全局变量,全局静态变量,局部变量的区别和联系

    C++变量根据定义位置的不同,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名作用域和文件作用域. 从作用域看: 全局变量具有全局作用域.全局变量只需在一个源文件 ...

  7. 全局变量&局部变量&Static存储&Register变量

    1.局部变量 局部变量也称为内部变量.局部变量是在函数内作定义说明的.其作用域仅限于函数内:函数的形参就是局部变量: 2.全局变量 全局变量也称为外部变量,它是在函数外部定义的变量.全局变量的说明符为 ...

  8. 牛客网Java刷题知识点之全局变量(又称成员变量,分为类变量和实例变量)、局部变量、静态变量(又称为类变量)

    不多说,直接上干货! 定义类其实就是在定义类中的成员.成员:成员变量<-->属性,成员函数<-->行为. 局部变量在方法内部声明,并且只能在方法内部使用,在外层的方法被调用时被 ...

  9. Linux设置环境变量小结:设置永久变量&临时变量 全局变量&局部变量

    1.总结背景 在linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容.如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁 ...

随机推荐

  1. 父级(display:none)隐藏时,子节点的高度获取。

    当父节点display:none的时候,子节点的高度是0获取不到. 解决办法:用visibility替换display就可以了.

  2. PLSQL Developer连接远程Oracle

    注:内容来网络 (一)不安装客户端的解决办法. 第一种方法: 1.在安装ORACLE服务器的机器上搜索下列文件, oci.dll ocijdbc10.dll ociw32.dll orannzsbb1 ...

  3. 预定义宏,C语言预定义的宏详解

    1.预定义宏 对于预定义宏,相信大家并不陌生.为了方便处理一些有用的信息,预处理器定义了一些预处理标识符,也就是预定义宏.预定义宏的名称都是以"__"(两条下划线)开头和结尾的,如 ...

  4. Jenkins忘记密码

    当Jenkins密码忘记时,可以去Jenkins的安装目录下的users\用户名_xxxxx\config.conf文件下找下找到<passwordHash></passwordHa ...

  5. kali linux之webshell

    webacoo(web backdoor cookie) 类终端的shell 编码通信内容通过cookie头传输,隐蔽性较强 cm:base64编码的命令 cn:服务器用于返回数据的cookie头的名 ...

  6. 性能测试常用sql语句

    做了一段时间的性能测试,把自己在性能测试过程中,使用到的Oracle中用到的sql语句整理一番,做个备忘: (1)多个字段以某种格式拼接 Oracle方式:"||"字符串拼接符; ...

  7. loj #2509. 「AHOI / HNOI2018」排列

    #2509. 「AHOI / HNOI2018」排列   题目描述 给定 nnn 个整数 a1,a2,…,an(0≤ai≤n),以及 nnn 个整数 w1,w2,…,wn.称 a1,a2,…,an 的 ...

  8. 【guava】对象处理

    一,equals方法 我们在开发中经常会需要比较两个对象是否相等,这时候我们需要考虑比较的两个对象是否为null,然后再调用equals方法来比较是否相等,google guava库的com.goog ...

  9. Python获取网页Html文本

    Python爬虫基础 1.获取网页文本 通过urllib2包,根据url获取网页的html文本内容并返回 #coding:utf-8 import requests, json, time, re, ...

  10. VS2019和net core 3.0(整理不全,但是孰能生巧)

    更新 net core 3.0 只能配合vs2019 net core 3.0 新特性 详情 IntelliCode 智能插件 live share ctrl+. 快速重构 调试中的数据断点(很棒) ...