一、介绍与分类1、Bash变量的命名规则变量名只能包含字母、数字、下划线变量名不能以数字开头变量名区分大小写变量名各不相同inlength大于255个字符变量名在有效范围内必须唯一2.变量根据存储的数据类型分类在Bash中,默认的变量类型为字符串类型字符串类型整型浮点型日期类型3.变量分类用户用户自定义变量用户自定义变量名环境变量环境变量主要存放与系统运行环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。位置参数变量位置参数变量主要用于向脚本传递参数或数据。变量名不可自定义,变量功能固定。预定义变量预定义变量是已经在bash中定义的命令。变量名不可自定义,变量功能固定。二、用户自定义变量1、定义变量语法变量名=“变量值”表示等号两边不能有空格。当变量值中有空格时,将变量值用引号引起来。当前bash中的有效例子[root~]#age=18[root~]#name="zhangsan"2.变量调用语法$变量名说明需要在变量名前加$来调用变量,默认类型变量的是String类型,所以赋值时不能直接做+、-等操作来引用变量。赋值时可以使用“$变量名”或${变量名}来引用变量。如果要在值的两边使用引号,则必须使用双引号。如果使用单引号,单引号里面的变量不会被转换成变量值实例调用变量需要加上$[root~]#echo$namezhangsan变量默认类型是string类型,所以不能直接做+,-等操作[root~]#x=1[root~]#y=2[root~]#z=$x+$y[root~]#echo$z1+2赋值时引用变量values,可以用"$variablename"或${variablename}[root~]#a=hel[root~]#b="$a"lo[root~]#echo$bhello中有空格时变量值,用引号括起来。赋值时引用变量,必须使用双引号单引号不会转换为变量值[root~]#d='${b}world'[root~]#echo$d${b}world3.变量叠加实例[root~]$x=123[root~]$echo$x123[root~]$x=${x}456[root~]$echo$x123456[root~]$x="$x"789[root~]$echo$x1234567894。变量查看语法set[option]option-u:设置此项,调用未声明的变量时会报错(默认无提示)。实例m被分配了一个空字符串,并且n未定义。echo$m和$n默认没有提示[root~]#m=''[root~]#echomm[root~]#echo$m[root~]#echo$nset-u,echo$n会报错[root~]#set-u[root~]#echo$m[root~]#echo$nbash:n:unboundvariable5.变量删除语法unset变量名示例[root~]#set-u[root~]#x=hello[root~]#echo$xhello[root~]#unsetx[root~]#echo$xbash:x:unboundvariable三、环境变量1、环境变量和用户自定义变量区别在于环境变量是全局变量;用户定义的变量是局部变量。用户自定义变量只在当前shell中生效;环境变量在当前shell和该shell的所有子shell中生效。2.设置环境变量export变量名=变量值或变量名=变量值export变量名实例[root~]#exportxxx=env[root~]#env|grepxxxxxx=env[root~]#yyy=env[root~]#exportyyy[root~]#env|grepyyyyyy=env[root~]#yyy=yyy[root~]#环境|grepyyyyyy=yyy3.查看环境变量集:查看所有变量env:只查看环境变量实例[root~]#envXDG_SESSION_ID=2HOSTNAME=10.0.2.15SHELL=/bin/bashTERM=cygwinHISTSIZE=1000OLDPWD=/home/vagrantUSER=rootLS_COLORS=rs=0:di=01;34:ln=01;36:mh=00...36:*.xspf=00;36:SUDO_USER=vagrantSUDO_UID=1001USERNAME=rootPATH=/sbin:/bin:/usr/sbin:/usr/binMAIL=/var/spool/mail/vagrantPWD=/rootLANG=en_US.UTF-8SHLVL=1SUDO_COMMAND=/bin/suHOME=/rootLOGNAME=rootLESSOPEN=||/usr/bin/lesspipe.sh%sSUDO_GID=1001_=/bin/env4。删除当前shell中的环境变量unsetvariablenameenvironmentvariable并且这个shell中的所有东西都从shell中生效。在子shell中删除或修改环境变量不会影响父shell中的环境变量实例。定义环境变量xxx和yyy[root~]#exportxxx=xxx[root~]#exportyyy=yyy[root~]#envxxx=xxxyy=yyy进入子shell,环境变量xxx和yyy仍然有效[root~]#bash[root~]#envxxx=xxyyy=yyy...省略其他环境变量...删除子shell中的xxx,修改yyy的值[root~]#unsetxxx[root~]#yyy=zzz[root~]#envyyy=zzz...省略其他环境变量...回到父shell,xxx和yyy的值不受影响[root~]#exit[root~]#envxxx=xxxyyy=yyy...省略其他环境变量...5.常用环境变量环境变量说明HOSTNAME主机名SHELL当前shellTERM终端环境HISTSIZE历史命令数SSH_CLIENT当前运行环境通过ssh连接。这里记录客户端IPSSH_TTYssh连接的终端pts/1USER,当前登录用户PATH系统搜索命令的路径。PS1命名提示设置。env命令不会输出环境变量HOSTNAME=10.0.2.15SHELL=/bin/bashTERM=cygwinHISTSIZE=1000SSH_CLIENT=10.0.2.2843222SSH_TTY=/dev/pts/0USER=vagrantPATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/binPATH环境变量系统搜索命令路径查看PATH环境变量[root~]#echo$PATH/sbin:/bin:/usr/sbin:/usr/bin增加PATH环境变量[root~]#PATH="$PATH":/usr/share/bin[root~]#echo$PATH/sbin:/bin:/usr/sbin:/usr/bin:/usr/share/bin注意,这种修改方法只在当前shell中生效。如果要永久生效,必须修改环境变量配置文件。PS1环境变量命令提示符设置常用提示符说明\d:显示日期,格式为“周月日”\H:显示完整主机名,如“localhost”\t:显示24小时制时间,格式为“HH:MM:SS”\A:以24小时格式显示时间,格式为“HH:MM”\u:显示当前用户名\w:显示当前目录的完整名称\W:显示当前目录的最后一个目录\$:提示符,如果是root用户会显示“#”,普通用户会显示“$”Instance[root~]#PS1='[\d]'[Mon5月28日]PS1='[\H]'[10.0.2.15]PS1='[\t]'[09:51:09]PS1='[\A]'[09:51]PS1='[\u]'[root]PS1='[\w]'[~]PS1='[\W]'[~]PS1='[\$]'[#]PS1='[\[\e[1;31m\]\u\[\e[1;34m\]\w\[\e[0m\]]\$'[root~]#注意这个修改方法只在当前shell生效,如果你想永久生效,必须修改环境变量配置文件。6.语言变量LC_ALL:LC_ALL[root~]#localeLANG=en_US.UTF-8LC_CTYPE="en_US.UTF-8"LC_NUMERIC="in_US.UTF-8"LC_TIME="in_US.UTF-8"LC_COLLATE="in_US.UTF-8"UTF-8"LC_MONETARY="in_US.UTF-8"LC_MESSAGES="in_US.UTF-8"LC_PAPER="en_US.UTF-8"LC_NAME="en_US.UTF-8"LC_ADDRESS="en_US.UTF-8"LC_PHONE="en_US.UTF-8"LC_MEASUREMENT="en_US.UTF-8"LC_IDENTIFICATION="en_US.UTF-8"LC_ALL=语言变量LANG查看[root~]#echo$LANGen_US.UTF-8查看所有支持的语言通过系统[root~]#locale-a|moreaa_DJaa_DJ.iso88591aa_DJ.utf8aa_ER...省略n行...ar_SYar_SY.iso88596ar_SY.utf8ar_TNar_TN。iso88596--更多--查询系统默认语言/etc/locale.conf#CentOS7/etc/sysconfig/i18n#CentOS6instance[root~]#cat/etc/locale.confLANG="en_US.UTF-8"4.位置参数变量1.常用的位置参数变量位置参数变量函数$nn是一个数字,$0代表命令本身,$1-$9代表第一个到第九个参数,十个以上的参数需要用大括号括起来,比如${.10}$*这个变量代表命令行中的所有参数,$*把所有的参数作为一个整体来对待$@这个变量代表命令行中的所有参数,$@把每个参数单独对待$#这个变量代表commandline参数个数2.$n创建加法的shell脚本[root/tmp]#vimeg1.sh#!/bin/bashnum1=$1num2=$2#变量sum为num1加上num2=$(($num1+$num2))#输入输出变量sum的值echo$sum运行shell脚本[root/tmp]#chmoda+xeg1.sh[root/tmp]#./eg1.sh3253.$0,$*,$@,$#[root/tmp]#vimeg2.sh#!/bin/bashecho"\$0命令为:$0"echo"\$*参数为:$*"echo"\$@参数为:$@"echo"\$#TheparameterThenumberis:$#"Runshellscript[root/tmp]#chmoda+xeg2.sh[root/tmp]#./eg2.sh12345$0命令为:./eg2.sh$*参数为:12345$@参数为:12345$#参数个数为:5[root/tmp]#./eg2.sh789$0命令为:./eg2.sh$*参数为:789$@参数为:789$#参数个数为:34$*和$@[root/tmp]#vimeg3.sh#!/bin/bashecho"\$*中的所有参数被视为一个整体,所以这个for循环只会循环一次"formin"$*"doecho"参数为:$m"doneecho-e"\n--------------------------------------------------------\n"echo"\$@中的每个参数都被认为是独立的,所以如果"$@"中有多个参数,则会循环多次"fornin"$@"doecho"Theparameteris:$n"done运行shell脚本[root/tmp]#chmoda+xeg3.sh[root/tmp]#./eg3.sh12345$*中的所有参数都是作为一个整体来考虑的,所以这个for循环只会循环一次。参数为:12345----------------------------------------------------------$@中的每个参数都看做是独立的,所以“12345”中有几个参数,循环多少次次要参数为:1参数为:2参数为:3参数为:4参数为:5五、预定义变量1、常用预定义变量预定义变量的作用$?最后执行的命令返回状态如果该变量的值为0,则表示正确执行了前面的命令;如果这个变量的值不为0(具体值由命令自己决定),说明之前的命令没有正确执行。$$当前进程的进程号(PID)$!后台运行的最后一个进程的进程ID(PID)2.$?:最后执行命令的返回状态[root/tmp]#lseg1.sheg2.sheg3.sh[root/tmp]#echo$?0[root/tmp]#categcat:eg:Nosuchfileordirectory[root/tmp]#echo$?1[root/tmp]#lllbash:lll:commandnotfound[root/tmp]#echo$?1273.$$:当前进程的进程号(PID)[root/tmp]#echo$$4311[root/tmp]#vimbl.sh#!/bin/bashecho"currentProcessPID:$$"[root/tmp]#chmoda+xbl.sh[root/tmp]#./bl.sh当前进程PID:43824$!:后台运行的最后一个进程的进程号(PID)[root/tmp]#find/-namehello&[1]4408[root/tmp]#echo$!4408[root/tmp]#echo$!4408[1]+Donefind/-namehello六、读取接收键盘输入1.命令读取[option][变量名]2.Option-p提示信息:等待用户输入时,输出提示信息-tSeconds:指定等待用户输入的时间长度(秒),如果不设置则一直等待用户输入-n个字符:最大输入字符数,当用户输入指定字符数时,自动执行-s:隐藏用户输入的数据,适用于机密信息的输入3.示例[root/tmp]#vimread.sh#!/bin/bash#等待30秒read-p'请输入您的用户名:'-t30nameecho$name#Hideinputread-p'请输入您的密码:'-spasswdecho-e'\n'echo$passwd#最多只能输入一个字符read-p'请输入性别[M/F]:'-n1sexecho-e'\n'echo$sex[root/tmp]#./read.sh请输入您的用户名:Mr.wangMr.wang请输入您的密码:123456请输入您的性别[男/女]:MM
