SHELL脚本编程变量详解
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 ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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=$' \t\n' 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 "\033]0;%s@%s:%s\007" "${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 ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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 ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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 ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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 ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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 ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
bash内建的环境变量如下:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
HOSTNAME
HISTSIZE
_ 下划线
4>.只读变量
[root@node101.yinzhengjie.org.cn ~]# readonly installDir="C:\Users\yinzhengjie" #定义只读变量方式一 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $installDir C:\Users\yinzhengjie [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# declare -r workDir="D:\Users\yinzhengjie" #定义只读变量方式二 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $workDir D:\Users\yinzhengjie [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# declare -r installDir="D:\Users\yinzhengjie" #只读变量只能声明,但不能修改和删除 -bash: declare: installDir: readonly variable [root@node101.yinzhengjie.org.cn ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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 -- 清空所有位置变量
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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 ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~/shell]# vim vars [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# cat vars COLOR="\033[1;31m" COLOREND="\033[0m" [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# vim rm.sh [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# vim rm.sh [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# cat rm.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-21 #FileName: rm.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** #导入其它脚本中的变量,在当前脚本就不用重复定义了,直接调用被调用者的变量即可 . /root/shell/vars DESTDIR=/tmp/`date +%F_%T` mkdir $DESTDIR mv $* $DESTDIR echo -e "$COLOR$* is moved to $DESTDIR$COLOEREND" [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# chmod +x rm.sh [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# touch /data/f1.txt /data/f2.txt [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# rm.sh !* #"!*"表示上一条执行命令的参数 rm.sh /data/f1.txt /data/f2.txt /data/f1.txt /data/f2.txt is moved to /tmp/2019-11-21_05:04:46 [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# ll /tmp/2019-11-21_05:04:46 total 0 -rw-r--r-- 1 root root 0 Nov 21 05:04 f1.txt -rw-r--r-- 1 root root 0 Nov 21 05:04 f2.txt [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# alias rm=/root/shell/rm.sh #将系统的rm命令换成咱们自定义的rm.sh命令。 [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# rm /etc/issue /etc/motd /etc/issue /etc/motd is moved to /tmp/2019-11-21_05:05:55 [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# ll /tmp/2019-11-21_05:05:55 total 4 -rw-r--r--. 1 root root 23 Nov 23 2018 issue -rw-r--r--. 1 root root 0 Jun 7 2013 motd [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# mv /tmp/2019-11-21_05:05:55/* /etc/ [root@node101.yinzhengjie.org.cn ~/shell]#
四.退出状态
1>.进程使用退出状态来报告成功或失败
0 代表成功,1-255代表失败 $? 变量保存最近的(上一条执行的)命令退出状态
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~]# ping -c 1 -w 1 www.baidu.com &> /dev/null [root@node101.yinzhengjie.org.cn ~]# echo $? 0 [root@node101.yinzhengjie.org.cn ~]#
2>.bash自定义退出状态码
exit [n]:
自定义退出状态码
温馨提示:
脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~/shell]# vim test.sh [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# cat test.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-21 #FileName: test.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** ls -l exit 200 [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# bash test.sh total 28 -rw-r--r-- 1 root root 715 Nov 21 04:22 arg.sh -rwxr-xr-x 1 root root 549 Nov 20 07:58 backup_etc.sh -rwxr-xr-x 1 root root 575 Nov 21 04:47 father.sh -rwxr-xr-x 1 root root 698 Nov 21 05:03 rm.sh -rwxr-xr-x 1 root root 554 Nov 21 04:45 son.sh -rw-r--r-- 1 root root 476 Nov 21 05:17 test.sh -rw-r--r-- 1 root root 38 Nov 21 04:56 vars [root@node101.yinzhengjie.org.cn ~/shell]# [root@node101.yinzhengjie.org.cn ~/shell]# echo $? 200 [root@node101.yinzhengjie.org.cn ~/shell]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@yinzhengjie shell]# more argv3.sh #!/bin/bash #@author :yinzhengjie #blog:http://www.cnblogs.com/yinzhengjie #EMAIL:y1053419035@qq.com echo "当前的进程PID是:$$" find /root -name yinzhengjie.sh > res.txt & echo "后台执行的进程是:$!" [root@yinzhengjie shell]#
五.变量赋值
通过x的值判断y是否存在,可以用下面的这种方式:
例子:测试x=${y-新值},如下图所示。
删除上述变量,在观察结果,如下图所示。
六.高级变量用法-有类型变量
Shell变量一般是无类型的,但是bash Shell提供了declare和typeset两个命令用于指定变量的类型,两个命令是等价的 declare [选项] 变量名 -r 声明或显示只读变量 -i 将变量定义为整型数 -a 将变量定义为数组 -A 将变量定义为关联数组 -f 显示已定义的所有函数名及其内容 -F 仅显示已定义的所有函数名 -x 声明或显示环境变量和函数 -l 声明变量为小写字母 declare –l var=UPPER -u 声明变量为大写字母 declare –u var=lower
七.eval命令
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量.该命令对变量进行两次扫描
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~]# whoami root [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# CMD="whoami" [root@node101.yinzhengjie.org.cn ~]# echo $CMD whoami [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# eval $CMD root [root@node101.yinzhengjie.org.cn ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~]# n=10 [root@node101.yinzhengjie.org.cn ~]# echo $n 10 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo {0..$n} {0..10} [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# eval echo {0..$n} 0 1 2 3 4 5 6 7 8 9 10 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
八.间接变量引用
如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用 variable1的值是variable2,而variable2又是变量名,variable2的值为value,间接变量引用是指通过variable1获得变量值value的行为 variable1=variable2 variable2=value bash Shell提供了两种格式实现间接变量引用 eval tempvar=\$$variable1 tempvar=${!variable1}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~]# NAME100=NAME200 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# IP100=IP200 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# IP200="172.30.1.200" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# IP=${!IP100} [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $IP 172.30.1.200 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# eval IP2=\$$IP100 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $IP2 172.30.1.200 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~]# title=CEO [root@node101.yinzhengjie.org.cn ~]# CEO="yinzhengjie" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $title CEO [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${!title} yinzhengjie [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# eval echo \$$title yinzhengjie [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
九.创建临时文件和安装复制文件命令
1>.创建临时文件
mktemp命令:创建并显示临时文件,可避免冲突 mktemp [OPTION]... [TEMPLATE] TEMPLATE: filenameXXX X至少要出现三个 常用选项(OPTION): -d: 创建临时目录 -p DIR或--tmpdir=DIR:指明临时文件所存放目录位置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# mktemp backup/fileXXX #创建一个临时文件(注意整个"X"字母要大写哟~) backup/fileWBI [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 -rw------- 1 root root 0 Nov 29 18:28 fileWBI [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# mktemp backup/fileXXXXXX #字母"X"的个数表示file后面跟的随机字母个数 backup/fileRzD8PZ [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 -rw------- 1 root root 0 Nov 29 18:28 fileRzD8PZ -rw------- 1 root root 0 Nov 29 18:28 fileWBI [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# mktemp -d backup/fileXXXXXX #创建一个临时目录 backup/filevlxViC [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 -rw------- 1 root root 0 Nov 29 18:28 fileRzD8PZ drwx------ 2 root root 6 Nov 29 18:29 filevlxViC -rw------- 1 root root 0 Nov 29 18:28 fileWBI [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# mktemp -d -p backup/ fileXXXXXX #指明临时文件所存放目录位置 backup/fileuoXi4V [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 -rw------- 1 root root 0 Nov 29 18:28 fileRzD8PZ drwx------ 2 root root 6 Nov 29 18:30 fileuoXi4V drwx------ 2 root root 6 Nov 29 18:29 filevlxViC -rw------- 1 root root 0 Nov 29 18:28 fileWBI [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# tmpdir=`mktemp -d backup/testdirXXX` #创建临时目录 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 drwx------ 2 root root 6 Nov 29 18:34 testdirxRs [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# mktemp --tmpdir=/root/backup testXXXXXX #指明临时文件所存放目录位置 /root/backup/test5zib2x [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 -rw------- 1 root root 0 Nov 29 18:36 test5zib2x drwx------ 2 root root 6 Nov 29 18:34 testdirxRs [root@node101.yinzhengjie.org.cn ~]#
2>.安装复制文件
install命令:(相当于mkdir,cp,chown,chmod命令的集成) install [OPTION]... [-T] SOURCE DEST 单文件 install [OPTION]... SOURCE... DIRECTORY install [OPTION]... -t DIRECTORY SOURCE... install [OPTION]... -d DIRECTORY...创建空目录 常用选项(OPTION): -m MODE,默认755 -o OWNER -g GROUP
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[root@node101.yinzhengjie.org.cn ~]# ll /etc/issue -rw-r--r--. 1 root root 23 Nov 23 2018 /etc/issue [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 0 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# install -m 600 -o yinzhengjie -g root /etc/issue /root/backup/issue_bak [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 4 -rw------- 1 yinzhengjie root 23 Nov 29 18:44 issue_bak [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# install -m 700 -d /root/backup/{nginx,mysql,python} [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll backup/ total 4 -rw------- 1 yinzhengjie root 23 Nov 29 18:44 issue_bak drwx------ 2 root root 6 Nov 29 18:45 mysql drwx------ 2 root root 6 Nov 29 18:45 nginx drwx------ 2 root root 6 Nov 29 18:45 python [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
十.小试牛刀
1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中 3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值 4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/7637684.html