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 ~]# 
[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 ~]# 
[root@node101.yinzhengjie.org.cn ~]# set     #显示已定义的所有变量

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 ~]# env           #显示所有环境变量
[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 ~]# printenv         #显示所有环境变量
[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 ~]# export         #显示所有环境变量
[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 ~]# 
 
[root@node101.yinzhengjie.org.cn ~]# declare -x       #显示所有环境变量
bash内建的环境变量如下:
    PATH
    SHELL
    USER
    UID
    HOME
    PWD
    SHLVL
    LANG
    MAIL
    HOSTNAME
    HISTSIZE
    _ 下划线
bash内建的环境变量

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 ~]# 
[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 ~]# 
[root@node101.yinzhengjie.org.cn ~]# readonly -p     #查看只读变量

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 ~]# vim shell/arg.sh        #编写测试脚本验证位置变量的作用
[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="\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]# 
自定义垃圾箱,将系统的rm命令换成咱们自定义的rm.sh命令,避免生产环境中的无删除(初级版本)

 

 

四.退出状态

1>.进程使用退出状态来报告成功或失败

  0 代表成功,1-255代表失败
  $? 变量保存最近的(上一条执行的)命令退出状态
[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 ~]# 
[root@node101.yinzhengjie.org.cn ~]# echo $?

2>.bash自定义退出状态码

exit [n]:
    自定义退出状态码
温馨提示:
  脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字   如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
[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]# 
在脚本中定义exit退出时返回的状态码
[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命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量.该命令对变量进行两次扫描
[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 ~]# 
参考案例1
[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 ~]# 
参考案例2

 

八.间接变量引用

如果第一个变量的值是第二个变量的名字,从第一个变量引用第二个变量的值就称为间接变量引用

variable1的值是variable2,而variable2又是变量名,variable2的值为value,间接变量引用是指通过variable1获得变量值value的行为
    variable1=variable2
    variable2=value

bash Shell提供了两种格式实现间接变量引用
    eval tempvar=\$$variable1
    tempvar=${!variable1}
[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 ~]# 
参考案例1
[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 ~]# 
参考案例2

 

九.创建临时文件和安装复制文件命令

1>.创建临时文件

mktemp命令:创建并显示临时文件,可避免冲突

mktemp [OPTION]... [TEMPLATE]
    TEMPLATE: filenameXXX
        X至少要出现三个

常用选项(OPTION):
  -d: 创建临时目录
  -p DIR或--tmpdir=DIR:指明临时文件所存放目录位置
[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 ~]# 
参考案例1
[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

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
[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地址和连接数,并按连接数从大到小排序

 

posted @ 2017-10-08 16:13  尹正杰  阅读(1435)  评论(0编辑  收藏  举报