1)变量类型

1)变量可分为俩类:环境变量(全局变量),和普通变量(局部变量),

  环境变量也称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程Shell中使用,环境变量又可以分为自定义环境变量和bash内置的环境变量,环境变量可以在命令行中设置和创建,用户退出命令行时这些变量值就会丢失,想要永久保存环境变量,可在用户家目录下的. bash_profile或. bashrc(非用户登录模式特有,如:SSH)文件中,或在/etc/profile文件中定义,这样每次用户登录时这些变量都将被初始化。

普通变量也可成为局部变量,只能在创建它们的Shell函数或Shell脚本中使用,普通变量一般由开发者在开发脚本程序时创建,

2)查看设置的变量

set命令输出所有的变量,包括全局变量和局部变量

  [root@king ~]# set
APACHEERR=hello world
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([]="" []="" []="" []=""
中间和结尾省略若干代码

env(printenv)命令只显示全局变量,

 [king@king~]$ env
HOSTNAME=king
SHELL=/bin/bash #大家可以自行查看一下哦

declare命令输出所有的变量,函数,整数,和已经导出的变量,set -o命令显示bashShell的所有参数配置信息

3)自定义环境变量

如果想设置环境变量,就要给在给变量赋值后或在设置变量时使用export命令,export命令和declare命令的格式:

  1. export 变量名=value
  2. 变量名=value ; export 变量名
  3. declare - x 变量名=value

小试牛刀:定义环境变量并赋值的方法:

  1. export NAME=qzlking
  2. declare -x NAME=qzlking
  3. NAME=qzlking ; exprot NAME
 [root@king script]# cat /etc/profile|grep qzl
export qzl='qzlking'       #<==编辑/etc/profile,然后输出此行并保存
[root@king script]# source /etc/profile #<==或./etc/profile使其生效
[root@king script]# echo $qzl #<==在变量前加$符号并打印变量值
qzlking
[root@king script]# env|grep qzl #<==查看定义结果
qzl=qzlking

我们一起来看一下让环境变量永久生效的常用配置文件

a)用户环境变量配置

 [root@king scripts]# ls /root/.bashrc
/root/.bashrc
[root@king scripts]# ls /root/.bash_profile
/root/.bash_profile

说明:对于用户的环境变量设置,常见的是用户家目录下的.bashrc和.bash_profile。

b)全局环境变量的配置

常见的全局环境变量配置文件,/etc/profile;/etc/bashrc;/etc/profile.d这三个配置文件,如果想要在登陆后初始化或者显示加载的内容,只需要把脚本文件放在/etc/profile.d文件下即可(不需要加执行权限)。

在Java环境中,自定义环境变量,通常放在/etc/profile全局环境变量里哦,

 export JAVA_HOME=/application/jdk
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export RESIN_HOME=/application/resin   

4)查看/取消环境变量

我们通常在工作中要查看一下环境变量中都配置了什么,需要做什么更改,所以我们就有了ehco或printf命令来打印查看环境变量。

  1. $HOME:用户登录时进入的目录
  2. $UID:当前用户的uid( 也就是用户的标识,相当于人的身份证)相当于id -u
 [king@king ~]$ echo $HOME
/home/king
[king@king ~]$ echo $UID

我们可以用unset来消除本地变量和环境变量

 [king@king ~]$ echo $USER
nane
[king@king ~]$ unset $USER
[king@king ~]$ echo $USER #<这里输出是个空行

小结:

  • 变量名一定要大写,可以在自身的Shell及子Shell中使用,常用export来定义环境变量
  • 执行enc默认可以显示所有的环境变量名称及对应的值
  • 输出时用“$变量名”,取消用“unset 变量名”

2)环境变量初始化与对应文件的生效顺序

1.登陆Shell读取环境变量文件的流程

  用户登录系统后首先会加载/etc/profile全局环境变量文件,加载完后,执行/etc/profile.d目录下的脚本文件(如:系统的字符集设置/etc/sysconfigil8n),然后在运行$HOME/.bash_profile(用户环境变量文件),在这文件里会找$HOME/.bashrc(用户环境变量文件),有就执行,没有就不执行。在$HOME/.bashrc找/etc/bashrc(全局环境变量文件)有就执行,没有就不执行。如果希望用户的Shell不是登陆时启动的(如:手动敲下bash时启动或者远程ssh连接情况),非登陆Shell只会加载$HOME/.bashrc(用户环境变量文件),并会去找/etc/bashrc(全局环境变量文件)。即非登陆Shell想读到设置的环境变量,需要将变量设定等写入$HOME/.bashrc(用户环境变量文件)或etc/bashrc(全局环境变量文件)不是$HOME/.bash_profile或/etc/profile。。。

3)定义本地变量

1)普通变量的定义,有三种写法

  1. 变量名=value       #不加引号时,值里有变量的会被解析后输出。
  2. 变量名='value'     #输出变量内容时单引号里是什么就输出什么,不管什么都原样输出。
  3. 变量名="value"    #输出变量内容时引号里的变量和命令经过解析后输出。

2)命令结果作为的变量内容来赋值

  1. 变量名=`mkdir`    #这里是反引号,
  2. 变量名=$(mkdir)  #把命令$()括起来,来赋值。

4)变量定义的技巧总结

  • 变量名只能为字母,数字或者下划线,只能以字母或下划线开头,要见名知意。
  • 一般变量的定义,赋值常用双引号,希望原样输出的加单引号。
  • 希望变量的内容是命令的解析结果时,要用反引号``,或者用$()把命令括起来在赋值
  • 打印输出或使用变量时,变量名前要接$符号。

变量定定义示例:

 KingAge=25        #<==每个单词的首字母大写的写法
king_age=25 #<==单词之间用"_"的写法
kingAgeSex=25 #<==驼峰语法: 首个单词的首字母小写,其余单词首字母大写
kingAGE=25 #<==单词全大写的写法

5)Shell特殊位置变量

Shell中存在一些特殊且重要的变量,如下

  • $0    获取当前执行Shell脚本的文件名字,如果执行脚本时候加了路径,那就包含脚本路径跟脚本名字一起输出
  • $n    获取当前执行Shell交本的第n个参数,n=1..9,n>9,后面参数变量就需要用大括号,如:${10},以空格分隔
  • $#    获取当前执行Shell脚本接了多少个参数(总计)
  • $*    获取当前执行Shell脚本所有传参的参数
  • $@    获取当前执行Shell脚本所有传参的参数($*和$@详解见例子)
 1 [root@ king tmp]# cat t.sh
2 if [ $# -ne 2 ]             #如果执行脚本传参的个数不为2,
3 then
4 echo "USAGE:/bin/sh $0 arg1 arg2" #则给用户提示正确用法,此处的$0,打印脚本名字及路径。
5 exit 1                #若不满足要求,则退出脚本,返回值为1。
6 fi
7 echo $1 $2                #若参数满足要求,则打印$1和$2获取到的传参的字符串。
8 [root@ king tmp]# sh t.sh #若不加参数执行脚本,则直接给出提示。
9 USAGE:/bin/sh t.sh arg1 arg2 #t.sh就是脚本中$0获取的值。
10 [root@ king tmp]# sh t.sh hello world
11 hello world #若参数满足要求,则打印$1和$2获取的字符串,即hello和world。

$0,$n,$#,这几个就不多说了,因为太好理解了,下面我们来一起学习一下$*和$@的区别吧。

我们可以利用set 来设置位置参数Age of loss

 1 [root@king tmp]# set -- "This is" Age of loss.  #“--”表示清除所有的参数变量,重新设置后面的参数变量。
2 [root@king tmp]#echo $# #输出参数的个数。
3 3                #共三个参数。
4 [root@king tmp]# echo $1 #打印第一个参数值。
5 This is
6 [root@king tmp]# echo $2 #打印第二个参数值。
7 Age
8 [root@king tmp]# echo $3 #打印第三个参数值。
9 of
10 [root@king tmp]# echo $4 #打印第四个参数值。
11 loss.
12 #测试$*和$@,注意,此时不带双引号:
13 [root@king tmp]# echo $* #打印$*。
14 This is Age of loss.
15 [root@king tmp]# echo $@ #打印$@。
16 This is Age of loss.
17 [root@king tmp]# for i in $*; do echo $i; done #使用for循环输出$*测试。
18 This          #($*)不加双引号,因此会输出所有参数,然后第一个参数"This is"也拆开输出了。
19 is
20 Age
21 of
22 loss
23 [root@king tmp]# for i in $@; do echo $i; done #使用for循环输出$@测试。
24 This #($@)不加双引号,因此会输出所有参数,然后第一个参数"This is"也拆开输出了。
25 is
26 Age
27 of
28 loss
29 #测试"$*"和"$@",注意,此时带有双引号:
30 [root@king tmp]# echo "$*"
31 This is Age of loss.
32 [root@king tmp]# echo "$@"
33 This is Age of loss.
34 [root@king tmp]# for i in "$*"; do echo $i; done
35 This is Age of loss. #在有双引号的情况下"$*",参数里引号中的内容当作一个参数输出了!
36 [root@king tmp]# for i in "$@"; do echo $i; done
37 This is #在有双引号的情况下,每个参数均以独立的内容输出,且有双引号算一个参数。
38 Age
39 of
40 loss
41 #这才真正符合我们传入的参数需求,set -- "This is" Age of loss.

6)Shell特殊状态变量

Shell特殊状态变量

  • $?     获取执行上一个指令的执行状态返回值(0成功,非0为失败)
  • $$      获取当前执行Shell脚本的进程号(PID)
  • $!      获取上一个在后台工作的进程的进程号(PID)
  • $_      获取在此之前执行的命令或脚本的最后一个参数

$?特殊变量,根据返回值来判断备份成功于否,例子

1 [root@king tmp]# cd /etc/
2 [root@king etc]# tar zcf /opt/services.tar.gz ./services #打包备份
3 [root@king etc]# echo $? #检查备份后的,返回0表示打包成功,
4 0

我们可以查看一下NFS网络文件共享系统/etc/init.d/rpcbind脚本中的50-73行吧,学习一下$?使用,

 1 [root@king scripts]# sed -n '63,73p' /etc/init.d/rpcbind        #sed  -n 打印文件指定行、
2 stop() {
3 echo -n $"Stopping $prog: "
4 killproc $prog #这是停止rpcbind的命令。
5 RETVAL=$? #将上述命令的返回值“$? ”赋值给RETVAL变量,用于后面的判断。
6 echo
7 [ $RETVAL -eq 0 ]&&{ #这里就是判断,如果返回值为0,则执行下面的指令。
8 rm -f /var/lock/subsys/$prog
9 rm -f /var/run/rpcbind*
10 }
11 return $RETVAL #如果返回值不等于0,则跳过判断,直接作为返回值传给执行stop函数的脚本。
12 }

$?返回值的用法总结:

  1. 判断命令,脚本或者函数等程序是否执行成功
  2. 若在脚本中调用执行“exit 数字”,则会返回这个数字给“$?”变量
  3. 如果是在函数里,则通过“return 数字”,把这个数字以函数返回值的形式传给“$?”

7)Shell特殊扩展变量

Shell特殊位置变量

我们可以man bash 命令,然后搜索"Parameter Expansion"来查找相关的内容帮助

  • ${parameter:-word}       如果parameter的变量值为空或没赋值,则返回word字符串并代替变量的值(变量没定义,返回备用的值,防止变量为空或没定义报错)
  • ${parameter:=word}      如果parameter的变量值为空或没赋值,。。。同上,(变量没定义为防止出错,找的备胎变量)
  • ${parameter:?word}      如果parameter的变量值为空或者没赋值,word字符串就作为标准错误输出,否则出书变量的值(捕捉由于变量未定义导致的错误,并退出)
  • ${parameter:+word}      若果parameter的变量值为空或者未赋值,则什么都不做,否则word字符串将代替变量的值。

${parameter:-word}用法距离:没有赋值的情况

1 [root@king tmp]# echo $test      #变量未设置,所以输出时为空。
2 [root@king tmp]# result=${test:-UNSET} #<==若test没值,则返回UNSET。
3 [root@king tmp]# echo $result    #打印result变量,返回UNSET,因为test没有赋值。
4 UNSET
5 [root@king tmp]# echo ${test}    #注意,此时打印test变量还是为空。
结论:对于${test:-UNSET},当test变量没值时,就返回变量结尾设置的UNSET字符串。
赋值的情况
1 [root@king tmp]# test=hello  #赋值hello字符串。
2 [root@king tmp]# echo $test
3 hello
4 [root@king tmp]# result=${test:-UNSET}
5 [root@king tmp]# echo $result #因为test已赋值,因此,打印result就输出了test的值hello,而不是原来的UNSET。
6 hello
7 [root@king tmp]# result=${test-UNSET} #定义时忽略了冒号。
8 [root@king tmp]# echo $result
9 hello #打印结果和带冒号时没有变化。

${parameter:=word}和${parameter:-word}差不多,理解都是一样的,变量为赋值就把备胎给变量。。。

${parameter:?word}变量为赋值或空,就将该字符串(word)作为标准错误输出。

 1 [root@king tmp]# echo ${key:? not defined}   #key变量没有定义,因此,把“not defined”作为标准错误输出。
2 -bash: key: not defined #错误提示,只不过是事先定义好的错误输出。
3 [root@king tmp]# echo ${key? not defined} #去掉冒号定义,并输出,结果一致。
4 -bash: key: not defined
5 [root@king tmp]# key=5 #<==给变量赋值1。
6 [root@king tmp]# echo ${key:? not defined} #因为key有值了,所以,打印key的值。
7 5
8 [root@king tmp]# echo ${key? not defined} #去掉冒号定义,并输出,结果一致。
9 5
10 [root@king tmp]# unset key #取消key的定义。
11 [root@king tmp]# echo ${key:? not defined}
12 -bash: key: not defined #又打印错误提示了。

${parameter:+word}变量为空或没赋值,什么都不做,否则用word字符串替换变量的值

1 [root@king tmp]# key=${value:+word}      #value变量未定义。
2 [root@king tmp]# echo $key #因为value变量未定义,所以打印key变量为空。
3 [root@king tmp]# value=25 #value变量赋值为25。
4 [root@king tmp]# key=${value:+word} #注意,这里一定要重新定义key。
5 [root@king tmp]# echo $key
6 word #因为value变量有值,所以打印key变量输出为“:+ ”后面的内容。

Shell环境变量与特殊变量详解的更多相关文章

  1. (十八)整合Nacos组件,环境搭建和入门案例详解

    整合Nacos组件,环境搭建和入门案例详解 1.Nacos基础简介 1.1 关键特性 1.2 专业术语解释 1.3 Nacos生态圈 2.SpringBoot整合Nacos 2.1 新建配置 2.2 ...

  2. linux环境下/etc/hosts文件详解

    linux环境下/etc/hosts文件详解 就没一个昵称能用关注 0.0632017.09.12 17:04:28字数 623阅读 27,096 介绍 hosts文件是linux系统中负责ip地址与 ...

  3. Shell脚本 /dev/null 2>&1详解

    Shell脚本---- /dev/null 2>&1详解   1.可以将/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. ...

  4. 好用的wget命令从下载添加环境变量到各参数详解

    本文是因为(笔者使用的windows系统)使用过好几次wget后,始终存在各种细节问题,于是下定决定细致的研究一下,并记录下其中细节. 下载与安装 第一步:下载wget,网络地址:http://dow ...

  5. shell编程变量介绍与表达式详解

    shell变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据.脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则. 在 Bash shell ...

  6. 条件变量pthread_cond_wait()和pthread_cond_signal()详解

    条件变量        条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起:另一个线程使"条件成立" ...

  7. shell-的特殊变量-进程状态变量$$ $! $? $_详解

    一:shell的特殊变量-进程状态变量详解  1. 进程状态变量 $$ 获取当前shell的进程号(pid) $! 执行上一个指令的pid,上一个后台运行进程的进程号 $? 获取执行上一个指令的返回值 ...

  8. [51单片机] Keil C51中变量的使用方法详解

    引言    8051内核单片机是一种通用单片机,在国内占有较大的市场份额.在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功.由于51内核单片机的存储结构的特殊性,Keil C51中变量 ...

  9. PHP如何释放内存之unset销毁变量并释放内存详解

    PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s = ...

  10. (转)面试题--JAVA中静态块、静态变量加载顺序详解

    public class Test { //1.第一步,准备加载类 public static void main(String[] args) { new Test(); //4.第四步,new一个 ...

随机推荐

  1. liunx screen使用简单实验

    liunx screen使用 今天因工作需要使用到screen工具,感觉挺有意思,记录一下 GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地 ...

  2. nefu 628 Garden visiting

    //yy:想到昨天一个神题整了几个小时,最后按题解把p拆了用孙子定理..今天这个简单,把C暴力拆了.. 题目链接:nefu 628 Garden visiting 1 <= n, m, p &l ...

  3. 创建Spring工程的基本步骤

    第一步:加入jar包 第二步:创建配置文件 -申明javabean 配置 <?xml version="1.0" encoding="UTF-8"?> ...

  4. 3.为JDeveloper添加不能的workspace

    1.点击选中JDeveloper,在属性中,选中快捷方式, 可以看到目标中的值为C:\Oracle\Middleware\jdeveloper\jdeveloper.exe, 只需要在修改为C:\Or ...

  5. HDU 6386 Age of Moyu 【BFS + 优先队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6386 Age of Moyu Time Limit: 5000/2500 MS (Java/Others ...

  6. Linux学习总结(十三)文本编辑器 vim

    vim是vi的升级版,会根据文本属性带色彩显示,具体用法如下: 一般模式 : 1.光标定位: 左右移动一个字符, h l上下移动一个字符, k j左右下上 ,左右在两边,下上在中间这样记光标定位行首 ...

  7. 四. 引入unittest单元测试框架

    1.   安装 SeleniumIDE(firefox) (1)下载地址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/ (2 ...

  8. idea删除module

    先remove , 再点击delete

  9. Jstorm TimeCacheMap源代码分析

    /*** Eclipse Class Decompiler plugin, copyright (c) 2016 Chen Chao (cnfree2000@hotmail.com) ***/ pac ...

  10. 【Git】Git使用小结

    Git与SVN及TFS这类传统的版本管理的区别: 本地机器也会有分支.代码库的概念 SVN常用的做法是每次写一些代码就提交到仓库,但是Git是先提交到本地(commit),然后当本地有个稳定的版本的时 ...