Shell 变量类型
变量可以分为两类:
环境变量(全局变量)和普通变量(局部变量)
环境变量也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程shell中使用,环境变量又可分为自定义环境变量和Bash内置的环境变量
普通变量也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的
环境变量
环境变量一般用于定义Shell的运行环境,保证Shell命令的正确执行,Shell通过环境变量来确定登录用户、命令路径、终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程,这包括编辑器,Shell脚本和各类应用(crond任务必须比较特殊)
环境变量可以在命令行中设置创建,但用户退出命令行时这些变量值就会丢失,因此,如果希望永久保存环境变量,可在用户家目录下的.bash_profile或.bashrc文件中或全局配置/etc/bashrc/或/etc/profile 文件或者/etc/profile.d中定义。将环境变量放入上述的文件中,每次用户登录时这些变量值都将被初始化一次
有一些环境变,比如HOME、PATH、UID、USER等,在用户登陆之前就已经被/bin/login 程序设置好了。通常环境变量定义保存在用户家目录下的.bash_profile文件或者全局的配置文件/etc/profile中。
查看系统变量
env
命令只显示全局变量
[root@adminset ~]# env XDG_SESSION_ID=2 HOSTNAME=adminset TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.118.30 50050 22 SSH_TTY=/dev/pts/0 USER=root LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36: MAIL=/var/spool/mail/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin PWD=/root LANG=en_US.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME=/root LOGNAME=root SSH_CONNECTION=192.168.118.30 50050 192.168.118.59 22 LESSOPEN=||/usr/bin/lesspipe.sh %s XDG_RUNTIME_DIR=/run/user/0 _=/usr/bin/env OLDPWD=/root/tools
set输出所有的变量,包括全局变量和局部变量
[root@adminset ~]# set -o |head allexport off braceexpand on emacs on errexit off errtrace off functrace off hashall on histexpand on history on ignoreeof off
declare输出所有的变量、函数、整数和已经到处的变量,替代早期的typsest
[root@adminset ~]# declare BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION='4.2.46(1)-release' COLUMNS=124 DIRSTACK=() EUID=0 GROUPS=() HISTCONTROL=ignoredups HISTFILE=/root/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/root HOSTNAME=adminset HOSTTYPE=x86_64 ID=0 IFS=$' \t\n' LANG=en_US.UTF-8 LESSOPEN= LINES=12 LOGNAME=root LS_COLORS=rs=0:di=01 MACHTYPE=x86_64-redhat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 OLDPWD=/root/tools OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin PIPESTATUS=([0]="1") PPID=2749 PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' PS1='[\u@\h \W]\$ ' PS2='> ' PS4='+ ' PWD=/root SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SITE=() SSH_CLIENT='192.168.118.30 50050 22' SSH_CONNECTION='192.168.118.30 50050 192.168.118.59 22' SSH_TTY=/dev/pts/0 TERM=xterm UID=0 USER=root ")[37]="http://10.0.20.127:8091/health/health XDG_RUNTIME_DIR=/run/user/0 XDG_SESSION_ID=2 _=on colors=/root/.dircolors
自定义环境变量
设置环境变量
如果想设置环境变量
,就要给在变量赋值之后或设置变量时使用export
命令。带-x
选项的declare
内置命令也可完成同样的功能。
格式:
1.export变量名=value 2.变量名=value;export 变量名 3.declare -x 变量名=value 提示:以上为三种设置环境变量的方法 例: export NAME=oldboy declare -x NAME=oldboy NAME=oldboy;export NAME
让环境变量永久生效的常用设置文件及区别
1、用户的变量变量配置:
[root@www ~]# ls /root/.bashrc /root/.bashrc [root@www ~]# ls /root/.bash_profile /root/.bash_profile 提示:用户的环境变量设置常见的为用户家目录下的.bashrc和.bash_profile
2、全局环境变量的配置
全局环境的配置文件常见的配置文件为
/etc/profile /etc/bashrc /etc/profile.d
需要登陆后初始化或显示加载内容可以把脚本文件放在/etc/profile.d
下,设置可执行即可
3、生产环境 自定义JAVA环境配置实例
环境变量初始化与对应文件的生效顺序
1、通过系统用户登录后默认运行的shell
2、非登录交互式运行shell
3、执行脚本运行非交互式shell
环境变量知识小结:
1、变量名通常要大写
2、变量可以在自身的shell以及子shell中使用。
3、通过export来定义环境变量
4、输出用$变量名,取消用unset变量名
5、书写定时任务要注意环境变量,最好在执行的shell脚本中重新定义。
6、如果系统永久生效可以放在用户环境变量文件或全局环境变量文件里。
普通变量
定义本地变量
本地变量在用户当前的Shell生存期的脚本中使用。例如,本地变量OLDBOY取值为bingbing,这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,本地变量值将无效
1. 普通变量定义
变量名=value #<==赋值时不加引号
变量名='value' #<==赋值时加单引号
变量名="value" #<==赋值时加双引号
2.Shell中定义变量名及给变量内容赋值的要求
变量名一般是由字母
、数字
、下划线
组成,可以字母
或下划线开头
abc,abc123,abc_123
变量的内容可以使用单引号或双引号引起来,也可不加引号,但是这三
者是不同的。
3. 普通变量定义及输出的不同例子
[root@luoahong ~]# a=1 [root@luoahong ~]# b='2' [root@luoahong ~]# c="3" [root@luoahong ~]# echo "$a" 1 [root@luoahong ~]# echo "$b" 2 [root@luoahong ~]# echo "${c}" 3
提示:$
变量名表示输出变量,可以用$c
和${c}
两种用法
小结:连续普通字符串内容赋值给变量,不管用什么引号或者不用引号,它的内容是什么,打印变量就输出什么
4.例子2
[root@luoahong scripts]# a=192.168.1.2 [root@luoahong scripts]# b='192.168.1.2' [root@luoahong scripts]# c="192.168.1.2" [root@luoahong scripts]# echo "a=$a" a=192.168.1.2 [root@luoahong scripts]# echo "b=$b" b=192.168.1.2 [root@luoahong scripts]# echo "c=${c}" c=192.168.1.2 ============================================ [root@luoahong scripts]# a=192.168.1.2-$a [root@luoahong scripts]# b='192.168.1.2-$a' [root@luoahong scripts]# c="192.168.1.2-$a" [root@luoahong scripts]# echo "a=$a" a=192.168.1.2-192.168.1.2 [root@luoahong scripts]# echo "b=$b" b=192.168.1.2-$a [root@luoahong scripts]# echo "c=${c}" c=192.168.1.2-192.168.1.2-192.168.1.2
小结:数字内容变量定义可不加引号,其他没有特别要求的字符串等定义最好都加上双引号,确实真的需要原因输出的的就加单引号。
5. 把一个命令的结果作为变量的定义方法
获取命令结果的变量内容写法常见的有两种:
变量名=`ls` #<==命令用反引号引起来
变量名=$(ls) #<==命令用$()括起来
变量第一及输出说明
单引号、双引号、反引号与不加引号的知识说明
awk调用shell变量的特殊用法
自定义普通字符串变量
(1)内容是纯数字,简单连续字符(内容中不带任何空格)此时定义方式可以不加任何引号
a.OldboyAge=33 b.NETWORD=yes
(2)没特殊情况时,字符串一律用双引号定义,特别是多个字符串中间由空格时
a.NFS_MODULE="no load" b.MyName="Good game"
(3)当变量里内容需要原样输出时,要用单引号'',这样的需求极少
a.HOST_NAME='OCALHOST'
提示:
1、变量名只能为字母、数字、下划线,只能以字母或下划线开头
2、规范的命令名写法要见名如意。
OldboyAge=1 #每个单词的首字母大写
oldboy_age=1 #单词之间用“_”
oldboyAgeSex=1 #驼峰语法:首个单词的首字母小写,其余单词首字母大写
OLDBOY=1 #单词全大写
1.3 变量定义的完整小结:
(1)普通变量内容的定义:
连续的数字或字符串,可以不加引号,例如a=123
变量内容很多,还希望解析变量,就加双引号,例如a="/etc/rc.local $USER",会对内容中的USER解析输出
希望原样输出就用单引号,例如:a='$USER'
(2)希望编译内容是命令得解析结果的定义:
1.反引号括起来,例如:a=`ls`
2.或者$()括起来,例如:a=$(ls)
(3)变量的输出方法:
使用$变量名输出变量内容,常用echo $
变量名
变量定义的小结技巧:
可以多学习和模仿操作系统自带的/etc/init.d/functions 函数库脚本的定义思路,
多学习linux系统脚本中的定义,有经验的读者最终应形成一套适合自己的规范和习惯
1、变量名及变量内容定义小结
变量名只能为字母、数字或下划线,只能以字母或下划线开头
变量名的定义有一定的规范,并且要见名知意。
oldboyAge=1 oldboy_age=1 oldboyAgeSex=1 OLDBOYAGE=1
一般的变量定义,赋值常用双引号;简单连续的字符串可以不加引号;希望原样输出时使用单引号
希望变量的内容是命令的解析结果时,要用反引号``,或者$()把命令括起来再赋值
2、shell定义变量时使用"="的知识
a=1里的等号时复制的意思;比较变量是否相等时也可以用"="或"=="
3、打印输出及使用变量的知识
打印输出或使用变量时,变量名前要接$符号;变量名后面紧接其他字符的时候,要用大括号将变量部分单独括起来,以防止出现"金庸新著"的问题,在unset、export、(())等场景中使用单不打印变量时
不加$,这个有些例外
打印输出或使用变量时,一般加双引号或不加引号;如果实字符串变量,最好加双引号;希望原样输出时使用单引号