SHELL脚本编程变量详解
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.变量概述
1>.什么是变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。
变量是命名的内存空间,变量可以通过变量名访问。
在指令式语言中,变量通常是可变的,但在纯函数式语言(如Haskell)中,变量可能是不可变(immutable)的
在一些语言中,变量可能被明确为是能表示可变状态、具有存储空间的抽象(如在Java和Visual Basic中);
但另外一些语言可能使用其它概念(如C的对象)来指称这种抽象,而不严格地定义"变量"的准确外延。
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
简单的说,变量就是用一个固定的字符串(也可能是字符数字等的组合),替代更多更复杂的内容,这个内容里可能还会包含变量的路径,字符串等其他的内容。使用变量最大的好处就是方便,当然,除了方便以外,很多时候在编程中使用变量也是必须的,否则就发无法完成开发工作。
2>.变量类型
作用: (1)数据存储方式 (2)参与的运算 (3)表示的数据范围 类型: 字符 数值:整型、浮点型
3>.shell中变量命名法则
a>.变量名称可以由字母,数字和下划线组成,但是不能以数字开头; b>.在bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型; c>.变量用等号连接值,等号左右两侧不能有空格; d>.变量的值如果有空格,需要使用单引号或双引号包括; e>.在变量的值中,可以使用“"转义符; f>.如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用"${变量名}"包含; g>.如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令; h>.环境变量名建议大写,便于区分; i>.不能使程序中的保留字:例如if, for j>.见名知义,统一命名规则:驼峰命名法
4>.Shell中命名强烈建议规则
(1)变量名大写 (2)局部变量小写 (3)函数名小写 (4)用英文名字,并体现出实际作用
二.编程语言分类
静态编译语言(Static): 使用变量前,先声明变量类型,之后类型不能改变,在编译时检查。 典型代表:C,C++,Java 动态编译语言(Dynamic): 不用事先声明类型,随时可以赋值为其他类型。由于编程时不知道是什么类型,很难推断运行时的类型 典型代表:bash,Python 强类型语言(Strong): 不同类型数据操作,必须经过强制转换才同一类型才能运算。 典型代表:java , c# ,python 如:以下python代码 print('yinzhengjie'+ 18) 提示出错,不会自动转换类型 print('yinzhengjie'+str(18)) 结果为magedu10,需要显示转换类型 弱类型语言(Weak): 同类型间可以操作,自动隐式转换。即语言的运行时会隐式做数据类型转换,无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用 典型代表:bash(不支持浮点数),php,javascript 如:以下JavaScript代码
console.log(1+'a')
常见的编程语言分类大致如下图所示(图片来自网络)。
三.bash中变量的种类
1>.根据变量的生效范围等标准划分下面变量类型
局部变量:
生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
环境变量:
生效范围为当前shell进程及其子进程
本地变量:
生效范围为当前shell进程中某代码片断,通常指函数
位置变量:
$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:
$?, $0, $*, $@, $#,$$
2>.局部变量
[root@node101.yinzhengjie.org.cn ~]# echo $name #当前变量没有被定义,因此打印的是空行。 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# name="yinzhengjie" #定义一个局部变量,变量赋值可以是直接字串 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $name yinzhengjie [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# name="$USER" #变量弱引用,其中的变量引用会被替换为变量值 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $name root [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# name=`hostname` #变量的命令引用 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $name node101.yinzhengjie.org.cn [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# unset name #删除变量 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $name [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# name='$USER' #变量的强引用,其中的变量引用不会被替换为变量值,而保持原字符串 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $name $USER [root@node101.yinzhengjie.org.cn ~]#

[root@node101.yinzhengjie.org.cn ~]# set #显示已定义的所有变量 BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:p romptvars:sourcepathBASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION='4.2.46(2)-release' COLUMNS=135 DIRSTACK=() EUID=0 GROUPS=() HISTCONTROL=ignoredups HISTFILE=/root/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/root HOSTNAME=node101.yinzhengjie.org.cn HOSTTYPE=x86_64 IFS=$' ' JAVA_HOME=/home/softwares/jdk1.8.0_201 LANG=en_US.UTF-8 LESSOPEN='||/usr/bin/lesspipe.sh %s' LINES=27 LOGNAME=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:'MACHTYPE=x86_64-redhat-linux-gnu MAIL=/var/spool/mail/root MAILCHECK=60 OLDPWD=/data/script OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/data/script:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/softwares/jdk1.8.0_201/bin:/root/bin:/h ome/softwares/mysql/bin/PIPESTATUS=([0]="0") PPID=3755 PROMPT_COMMAND='printf " 33]0;%s@%s:%s 07" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"' PS1='[[e[34;1m]u@[e[0m][e[32;1m]H[e[0m] [e[31;1m]w[e[0m]]$ ' PS2='> ' PS4='+ ' PWD=/root QTDIR=/usr/lib64/qt-3.3 QTINC=/usr/lib64/qt-3.3/include QTLIB=/usr/lib64/qt-3.3/lib QT_GRAPHICSSYSTEM_CHECKED=1 SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SSH_CLIENT='172.30.1.254 50528 22' SSH_CONNECTION='172.30.1.254 50528 172.30.1.101 22' SSH_TTY=/dev/pts/0 TERM=xterm UID=0 USER=root XDG_RUNTIME_DIR=/run/user/0 XDG_SESSION_ID=1 _='$USER' colors=/root/.dircolors name='$USER' [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
3>.环境变量
[root@node101.yinzhengjie.org.cn ~]# echo ${age} #这是一种变量引用的方式 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# export age=18 #环境变量的声明方式一 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $age #这是另外一种变量引用的方式 18 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# declare -x age=20 #环境变量的声明方式二 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${age} 20 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# unset age #环境变量的删除 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${age} [root@node101.yinzhengjie.org.cn ~]#

[root@node101.yinzhengjie.org.cn ~]# env #显示所有环境变量 XDG_SESSION_ID=1 HOSTNAME=node101.yinzhengjie.org.cn TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=172.30.1.254 50528 22 QTDIR=/usr/lib64/qt-3.3 OLDPWD=/data/script QTINC=/usr/lib64/qt-3.3/include SSH_TTY=/dev/pts/0 QT_GRAPHICSSYSTEM_CHECKED=1 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=/data/script:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/softwares/jdk1.8.0_201/bin:/root/bin:/h ome/softwares/mysql/bin/PWD=/root LANG=en_US.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME=/root LOGNAME=root QTLIB=/usr/lib64/qt-3.3/lib SSH_CONNECTION=172.30.1.254 50528 172.30.1.101 22 LESSOPEN=||/usr/bin/lesspipe.sh %s XDG_RUNTIME_DIR=/run/user/0 _=/usr/bin/env [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# env | wc -l 26 [root@node101.yinzhengjie.org.cn ~]#

[root@node101.yinzhengjie.org.cn ~]# printenv #显示所有环境变量 XDG_SESSION_ID=1 HOSTNAME=node101.yinzhengjie.org.cn TERM=xterm SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=172.30.1.254 50528 22 QTDIR=/usr/lib64/qt-3.3 OLDPWD=/data/script QTINC=/usr/lib64/qt-3.3/include SSH_TTY=/dev/pts/0 QT_GRAPHICSSYSTEM_CHECKED=1 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=/data/script:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/softwares/jdk1.8.0_201/bin:/root/bin:/h ome/softwares/mysql/bin/PWD=/root LANG=en_US.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME=/root LOGNAME=root QTLIB=/usr/lib64/qt-3.3/lib SSH_CONNECTION=172.30.1.254 50528 172.30.1.101 22 LESSOPEN=||/usr/bin/lesspipe.sh %s XDG_RUNTIME_DIR=/run/user/0 _=/usr/bin/printenv [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# printenv | wc -l 26 [root@node101.yinzhengjie.org.cn ~]#

[root@node101.yinzhengjie.org.cn ~]# export #显示所有环境变量 declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000" declare -x HOME="/root" declare -x HOSTNAME="node101.yinzhengjie.org.cn" declare -x LANG="en_US.UTF-8" declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s" declare -x LOGNAME="root" declare -x 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:"declare -x MAIL="/var/spool/mail/root" declare -x OLDPWD="/data/script" declare -x PATH="/data/script:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/softwares/jdk1.8.0_201/bin: /root/bin:/home/softwares/mysql/bin/"declare -x PWD="/root" declare -x QTDIR="/usr/lib64/qt-3.3" declare -x QTINC="/usr/lib64/qt-3.3/include" declare -x QTLIB="/usr/lib64/qt-3.3/lib" declare -x QT_GRAPHICSSYSTEM_CHECKED="1" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SSH_CLIENT="172.30.1.254 50528 22" declare -x SSH_CONNECTION="172.30.1.254 50528 172.30.1.101 22" declare -x SSH_TTY="/dev/pts/0" declare -x TERM="xterm" declare -x USER="root" declare -x XDG_RUNTIME_DIR="/run/user/0" declare -x XDG_SESSION_ID="1" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# export | wc -l 25 [root@node101.yinzhengjie.org.cn ~]#

[root@node101.yinzhengjie.org.cn ~]# declare -x #显示所有环境变量 declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000" declare -x HOME="/root" declare -x HOSTNAME="node101.yinzhengjie.org.cn" declare -x LANG="en_US.UTF-8" declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s" declare -x LOGNAME="root" declare -x 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:"declare -x MAIL="/var/spool/mail/root" declare -x OLDPWD="/data/script" declare -x PATH="/data/script:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/softwares/jdk1.8.0_201/bin: /root/bin:/home/softwares/mysql/bin/"declare -x PWD="/root" declare -x QTDIR="/usr/lib64/qt-3.3" declare -x QTINC="/usr/lib64/qt-3.3/include" declare -x QTLIB="/usr/lib64/qt-3.3/lib" declare -x QT_GRAPHICSSYSTEM_CHECKED="1" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SSH_CLIENT="172.30.1.254 50528 22" declare -x SSH_CONNECTION="172.30.1.254 50528 172.30.1.101 22" declare -x SSH_TTY="/dev/pts/0" declare -x TERM="xterm" declare -x USER="root" declare -x XDG_RUNTIME_DIR="/run/user/0" declare -x XDG_SESSION_ID="1" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# declare -x | wc -l 25 [root@node101.yinzhengjie.org.cn ~]#

bash内建的环境变量如下:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
HOSTNAME
HISTSIZE
_ 下划线
4>.只读变量
[root@node101.yinzhengjie.org.cn ~]# readonly installDir="C:Usersyinzhengjie" #定义只读变量方式一 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $installDir C:Usersyinzhengjie [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# declare -r workDir="D:Usersyinzhengjie" #定义只读变量方式二 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $workDir D:Usersyinzhengjie [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# declare -r installDir="D:Usersyinzhengjie" #只读变量只能声明,但不能修改和删除 -bash: declare: installDir: readonly variable [root@node101.yinzhengjie.org.cn ~]#

[root@node101.yinzhengjie.org.cn ~]# readonly -p #查看只读变量 declare -r BASHOPTS="checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shel l:progcomp:promptvars:sourcepath"declare -ir BASHPID declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")' declare -ir EUID="0" declare -ir PPID="3755" declare -r SHELLOPTS="braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor" declare -ir UID="0" declare -r installDir="C:\Users\yinzhengjie" declare -r workDir="D:\Users\yinzhengjie" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
5>.位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2,...,$n $n这里的n为数字,$0代表命令本身,如$1.$2分别对应第1、第2个参数,10以上参数需要用大括号"{}"包含,如"$10"
shift [n]换位置
$0 命令本身
$* 传递给脚本的所有参数,全部参数合为一个字符串
$@ 传递给脚本的所有参数,每个参数为独立字符串,注意:$@ $* 只在被双引号包起来的时候才会有差异
$# 传递给脚本的参数的个数 set -- 清空所有位置变量

[root@node101.yinzhengjie.org.cn ~]# vim shell/arg.sh #编写测试脚本验证位置变量的作用 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# cat shell/arg.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-21 #FileName: shell/arg.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** echo "1st arg is $1" echo "2st arg is $2" echo "3st arg is $3" echo "10st arg is ${10}" echo "11st arg is ${11}" echo "12st arg is ${12}" echo "All arg are $*" echo "All arg are $@" echo "The number of arg is $#" echo "Script name is `basename $0`" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/arg.sh {A..Z} 1st arg is A 2st arg is B 3st arg is C 10st arg is J 11st arg is K 12st arg is L All arg are A B C D E F G H I J K L M N O P Q R S T U V W X Y Z All arg are A B C D E F G H I J K L M N O P Q R S T U V W X Y Z The number of arg is 26 Script name is arg.sh [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#

[root@node101.yinzhengjie.org.cn ~]# cd shell/ [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# vim father.sh [root@node101.yinzhengjie.org.cn ~/shell]# vim son.sh [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# cat father.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-21 #FileName: shell/father.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** echo "All arg are $*" #注意:"$@" "$*"只在被双引号包起来的时候才会有差异 son.sh "$*" [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# cat son.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-21 #FileName: shell/son.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** echo "1st arg is $1" echo "2st arg is $2" echo "3st arg is $3" echo "11st arg is ${11}" [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# chmod +x father.sh son.sh [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# tail -1 ~/.bashrc PATH=$PATH:/root/shell [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# father.sh {a..z} All arg are a b c d e f g h i j k l m n o p q r s t u v w x y z 1st arg is a b c d e f g h i j k l m n o p q r s t u v w x y z 2st arg is 3st arg is 11st arg is [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# vim father.sh [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# cat father.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-21 #FileName: shell/father.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** echo "All arg are $@" #注意:"$@" "$*"只在被双引号包起来的时候才会有差异 son.sh "$@" [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# father.sh {a..z} All arg are a b c d e f g h i j k l m n o p q r s t u v w x y z 1st arg is a 2st arg is b 3st arg is c 11st arg is k [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]#

[root@node101.yinzhengjie.org.cn ~/shell]# vim vars [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# cat vars COLOR="