1.用户自定义变量
在bash中,变量默认都是字符串型,若要进行数值运算,则需要指定变量类型为数值类型
给变量赋值时等号两边不能有空格,如果变量本身有空格,则需要用单引号或者双引号括起来
用户自定义变量只是在当前shell中生效
变量可叠加
1.1变量定义
###自定义变量name[root@wenhaijin tmp]# name='wen haijin'[root@wenhaijin tmp]# echo $namewen haijin###变量的叠加[root@wenhaijin tmp]# aa=123[root@wenhaijin tmp]# aa="$aa"456[root@wenhaijin tmp]# echo $aa123456[root@wenhaijin tmp]# aa=${aa}789[root@wenhaijin tmp]# echo $aa123456789
1.2变量查看
使用set命令可以查看系统所有的变量
###使用set查看系统所有变量[root@wenhaijin tmp]# setBASH=/bin/bashBASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepathBASH_ALIASES=()BASH_ARGC=()BASH_ARGV=()BASH_CMDS=()BASH_LINENO=()BASH_SOURCE=()BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")BASH_VERSION='4.1.2(1)-release'CLASSPATH=/usr/java/jdk1.8.0_111/jre/lib/ext:/usr/java/jdk1.8.0_111/lib/tools.jarCOLORS=/etc/DIR_COLORSCOLUMNS=80CVS_RSH=sshDIRSTACK=()EUID=0GROUPS=()G_BROKEN_FILENAMES=1HADOOP_HOME=/usr/local/hadoop/hadoop-2.7.3HISTCONTROL=ignoredupsHISTFILE=/root/.bash_historyHISTFILESIZE=1000HISTSIZE=1000HOME=/rootHOSTNAME=wenhaijinHOSTTYPE=x86_64ID=0IFS=$' \t\n'JAVA_HOME=/usr/java/jdk1.8.0_111LANG=en_US.UTF-8LESSOPEN='|/usr/bin/lesspipe.sh %s'LINES=24LOGNAME=rootLS_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:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=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:*.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-gnuMAIL=/var/spool/mail/rootMAILCHECK=60OLDPWD=/rootOPTERR=1OPTIND=1OSTYPE=linux-gnuPATH=/usr/java/jdk1.8.0_111/bin:/usr/local/mysql/bin:/usr/local/hadoop/hadoop-2.7.3/sbin:/usr/local/hadoop/hadoop-2.7.3/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binPIPESTATUS=([0]="0")PPID=22756PS1='[\u@\h \W]\$ 'PS2='> 'PS4='+ 'PWD=/tmpQTDIR=/usr/lib64/qt-3.3QTINC=/usr/lib64/qt-3.3/includeQTLIB=/usr/lib64/qt-3.3/libSHELL=/bin/bashSHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitorSHLVL=1SSH_CLIENT='113.87.160.186 56253 22'SSH_CONNECTION='113.87.160.186 56253 172.18.69.197 22'SSH_TTY=/dev/pts/2TERM=vt100UID=0USER=root_=123456789aa=123456789colors=/etc/DIR_COLORSname='wen haijin'
1.3变量的删除
使用“unset 变量名”可以删除变量
###删除变量aa[root@wenhaijin tmp]# unset aa
2.环境变量
这种变量中主要保存的是和系统操作环境相关的数据
用户自定义变量只是在当前shell中生效,而环境变量会在当前shell和这个shell的所有子shell中生效
如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效
2.1定义环境变量export
###申明一个本地变量name[root@wenhaijin tmp]# name=wenhaijin###申明一个环境变量age[root@wenhaijin tmp]# export age=18###申明一个本地变量sex[root@wenhaijin tmp]# sex=nan###将本地变量变为环境变量[root@wenhaijin tmp]# export sex###查看变量[root@wenhaijin tmp]# set###前面省略了很多信息,只展示我们所关注的age=18colors=/etc/DIR_COLORSname=wenhaijinsex=nan###在此处进入一个子shell(可以用pstree查看bash的线程树)[root@wenhaijin tmp]# bash###再查看变量发现环境变量age和sex依然生效,而name变量在这里已经访问不到[root@wenhaijin tmp]# set……………age=18colors=/etc/DIR_COLORSsex=nan###退出当前bash,回到上一级bash[root@wenhaijin tmp]# exitexit
2.2查询环境变量env
可以使用set命令查询所有变量,使用命令env则查询环境变量
###使用env查询环境变量省略号表示中间省略了一些暂时不太关注的环境变量信息[root@wenhaijin tmp]# env…………age=18…………sex=nanG_BROKEN_FILENAMES=1_=/bin/env
2.3调用变量$
调用环境变量与调用自定义变量(本地变量)是一样的
[root@wenhaijin tmp]# echo $age18
2.4删除环境变量unset
删除环境变量 也是和删除自定义变量(本地变量)是一样的
[root@wenhaijin tmp]# unset sex
2.5两个比较重要的环境变量
2.5.1 PATH环境变量
这个学编程的都清楚,系统之所以能执行各种命令,就是因为这些命令保存在PATH所标注的各个路径中
使用env或者直接使用echo $PATH可以看到这个环境变量
###查看PATH环境变量[root@wenhaijin tmp]# env | grep PATH PATH=/usr/java/jdk1.8.0_111/bin:/usr/local/mysql/bin:/usr/local/hadoop/hadoop-2.7.3/sbin:/usr/local/hadoop/hadoop-2.7.3/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binCLASSPATH=/usr/java/jdk1.8.0_111/jre/lib/ext:/usr/java/jdk1.8.0_111/lib/tools.jar###也可以直接使用$符号调用输出[root@wenhaijin tmp]# echo $PATH/usr/java/jdk1.8.0_111/bin:/usr/local/mysql/bin:/usr/local/hadoop/hadoop-2.7.3/sbin:/usr/local/hadoop/hadoop-2.7.3/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
2.5.2 定义系统提示符的变量PS1
其实系统并没有把PS1归为环境变量,所以需要使用set或者echo $PS1来进行输出查看
###其实系统并没有把PS1归为环境变量,所以使用env查看不到该变量[root@wenhaijin tmp]# env | grep PS1[root@wenhaijin tmp]# set | grep PS1PS1='[\u@\h \W]\$ '[root@wenhaijin tmp]# ###使用echo $PS1来进行输出查看[root@wenhaijin tmp]# echo $PS1[\u@\h \W]\$[root@wenhaijin tmp]#
从上面的结果可以看出
\u为当前用户名即root
@是一个标识符号没有特殊意义,依然对应@
\h为简写主机名,对应wenhaijin
\W为当前所在目录的最后一个目录,对应tmp目录
\$表示命令提示符,当前是root用户,所以对应#;如果是普通用户,则对应$符号
PS1变量是可以更改的
###在系统提示符中将当前时间展现出来,同时将当前目录的最后一个目录改成整个目录的完整路径[root@wenhaijin13:38:07 /tmp]# PS1='[\u@\h \t \w]\$ '###立竿见影,效果如下(这种修改方式是临时的,系统一旦重启将会失效,若要永久生效则需写入到对应的配置文件中)[root@wenhaijin 13:38:52 /tmp]#
3.位置参数变量
这种变量主要用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
3.1 $n的用法
$0表示命令本身,$0-$9分别表示第一到第九个参数,第10个以上的参数用${n}表示,如${10}表示第10个参数$
[root@wenhaijin tmp]# vim param1.sh #!/bin/bash#该脚本的功能是计算用户输入的两个数的和num1=$1num2=$2#在shell脚本中进行运算操作的写法是将要运算的表达式用$(( ))包起来,这是固定写法echo "the sum of the two numbers input is: $(( $num1+$num2 ))"~~~"param1.sh" 5L, 92C written #修改一下该shell的权限,赋予可执行权限[root@wenhaijin tmp]# chmod 755 param1.sh [root@wenhaijin tmp]# ./param1.sh ./param1.sh: line 5: + : syntax error: operand expected (error token is "+ ")[root@wenhaijin tmp]# ./param1.sh 10 20the sum of the two numbers input is: 30[root@wenhaijin tmp]#
3.2 $*和$@的区别
都代表所有参数,区别在于$*把所有参数看成一个整体,$@把所有参数中的各个参数区分对待
[root@wenhaijin tmp]# vim param2.sh###shell脚本的内容如下:#!/bin/bashecho 'the result of $*:'for i in "$*" do echo "the param index of i is: $i" doneecho 'the result of $@:'for y in "$@" do echo "the param index of i is: $y" done~~~"param2.sh" 17L, 212C written 给shell脚本赋予执行权限并演示执行结果[root@wenhaijin tmp]# chmod 755 param2.sh ###执行该shell,$*与$@的区别一目了然[root@wenhaijin tmp]# ./param2.sh 10 23 40 50 62the result of $*:the param index of i is: 10 23 40 50 62the result of $@:the param index of i is: 10the param index of i is: 23the param index of i is: 40the param index of i is: 50the param index of i is: 62
3.3$#代表参数个数,不包含当前命令本身(即$0)
直接编辑上面的shell(param2.sh),末尾加入下面两句
echo 'the result of $#:'echo "$#"
执行该shell,结果如下:
[root@wenhaijin tmp]# ./param2.sh 11 22 33 44 55the result of $*:the param index of i is: 11 22 33 44 55the result of $@:the param index of i is: 11the param index of i is: 22the param index of i is: 33the param index of i is: 44the param index of i is: 55the result of $#:5
4.预定义变量
是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
位置参数变量其实也可以看成是预定义变量中的一种
4.1 $?的使用
$?用来判断上一条命令是否正确执行,上一条命令是否正确执行我们一看执行结果就知道了,所以该命令很少在命令行中使用,主要是应用在程序中
[root@wenhaijin tmp]# ls012 abc fabc param2.sh0abc abcd param1.sh###返回0代表上一条命令正确执行,返回其他数字代表上一条命令执行异常[root@wenhaijin tmp]# echo $?0###$?为127表示命令不存在[root@wenhaijin tmp]# lsaaa-bash: lsaaa: command not found[root@wenhaijin tmp]# echo $?127###$?为1表示文件或目录不存在[root@wenhaijin tmp]# cat aaaacat: aaaa: No such file or directory[root@wenhaijin tmp]# echo $?1[root@wenhaijin tmp]#
4.2 $$表示当前进程的进程号(PID)
###当前进程号为13508[root@wenhaijin tmp]# echo $$13508
4.3 $!表示后台运行的最后一个进程的进程号(PID)
###当前后台运行的最后一个进程号为18906[root@wenhaijin ~]# echo $!18906
4.4 read接收键盘输入i(比$n更常用)
创建shell文件
[root@wenhaijin tmp]# vim read.sh
#!/bin/bash###接收键盘输入并赋值给变量name,超时时间为30秒,注意变量name前面有个空格read -t 30 -p "please input your name: " nameecho $name###接收键盘输入并赋值给变量age,将用户所输入的字符当做隐藏字符,超时时间为30秒read -s -t 30 -p "please enter your age: " ageecho -e "\n"echo "Age is $age " ###接收键盘输入并赋值给变量sex,"-n 1"表示当用户输入一个字符时触发变量的赋值操作,超时时间为30秒read -n 1 -t 30 -p "[M/F]: " sexecho "\n"echo $sex
修改shell权限
[root@wenhaijin tmp]# chmod 755 read.sh
执行该shell
[root@wenhaijin tmp]# ./read.sh please input your name: wenhaijinwenhaijinplease enter your age: Age is 18 [M/F]: M\nM[root@wenhaijin tmp]#