Linux学习笔记(16)shell基础之Bash变量
1. 用户自定义变量
(1)变量设置规则
① 变量名称可由字母、数字和下划线组成,但不能以数字开头;
② 变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型;
③ 变量用等号连接值,且等号两侧不能有空格;
④ 变量的值如果有空格,需使用单引号或双引号括起;
⑤ 变量的值中,可使用"\"转义符;
⑥ 如果需要增加变量的值,可以进行变量值的叠加,不过变量需要用双引号包含,即"$变量名",或者用${变量名}包含;
⑦ 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令;
⑧ 环境变量名建议大写,便于区分。
(2)变量分类
① 用户自定义变量;
② 环境变量:主要保存与系统操作环境相关的数据;
③ 位置参数变量:用于向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的;
④ 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。
(3)本地变量
① 变量定义:
[root@localhost ~]# name="ws" [root@localhost ~]# echo "$name" ws
② 变量叠加:
[root@localhost ~]# aa=123 [root@localhost ~]# aa="$aa"456 [root@localhost ~]# aa=${aa}789 [root@localhost ~]# echo $aa 123456789
③ 变量查看:
[root@localhost ~]# set aa=123456789 colors=/etc/DIR_COLORS name=ws
④ 变量删除
[root@localhost ~]# unset name
2. 环境变量
1)用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和该shell的所有子shell中生效。如果把环境变量写入相应的配置文件中,那么该环境变量就会在所有的shell中生效。
父shell中创建子shell,可在当前shell中通过命令bash或csh来创建。可通过pstree命令(功能:确定进程数)来查看父shell与子shell的关系。
例:
[root@localhost ~]# bash [root@localhost ~]# pstree ........ sshd───sshd───bash───bash───pstree
其中,sshd为远程连接工具,第一个bash为父shell,第二个bash是子shell,退出子shell只需输入命令exit即可。
2)设置环境变量
格式为:export 变量名=变量值
例:
#将age和sex变量设置为环境变量
[root@localhost ~]# name=ws [root@localhost ~]# export age=26 [root@localhost ~]# sex=male [root@localhost ~]# export sex
#然后在当前shell和子shell中进行查看
[root@localhost ~]# set name=ws age=26 sex=male [root@localhost ~]# bash age=26 sex=male
3)查询环境变量的命令为:env,删除变量的命令为:unset 变量名
4)系统常见环境变量
① PATH:系统查找命令的路径,系统命令并没有写路径就可执行,如ls,是由于PATH环境变量的作用。因此自己写的脚本拷贝到PATH指定的路径中,无需写路径即可直接执行。
例:
[root@localhost ~]# env | grep PATH PATH=/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin #PATH变量叠加 PATH="$PATH":/root/sh
② PS1:定义系统提示符的变量
提示符 |
含义 |
\d |
显示日期,格式为"星期 月 日" |
\h |
显示简写主机名 |
\T |
显示12小时制时间,格式为"HH:MM:SS" |
\A |
显示24小时制时间,格式为"HH:MM" |
\u |
显示当前用户名 |
\w |
显示当前所在路径的完整名称 |
\W |
显示当前所在目录的最后一个目录 |
\# |
执行的第几个命令 |
\$ |
提示符,root用户为"#",普通用户为"$" |
例:
[root@localhost ~]# PS1='[\u@\t \w]\$ ' [root@05:46:29 ~]# PS1='[\u@\h \# \W]\$ ' [root@localhost 12 ~]# PS1='[\u@\h \W]\$ ' [root@localhost ~]#
3. 位置参数变量
1)
位置参数变量 |
作用 |
$n |
n为数字,$0代表命令本身,$1-$9代表第一至第九个参数,十以上的参数需要用大括号包含,如${10} |
$* |
代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ |
也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# |
代表命令行中所有参数的个数 |
例1:写param.sh脚本
[root@localhost sh]# vim param.h #!/bin/sh echo $0 echo $1 echo $2 echo $3
验证$n,向脚本中传递参数
[root@localhost sh]# ./param.h 11 12 13 1 2 ./param.h 11 12 13
例2:param1.sh脚本
[root@localhost sh]# vim param1.h #!/bin/bash num1=$1 num2=$2 sum=$(( $num1 + $num2 )) echo $sum
验证:
[root@localhost sh]# ./param1.sh 1 2 3
例3:写param3.sh
[root@localhost tmp]# vim param3.sh #!/bin/bash #使用$#代表所有参数个数 echo "A total of $# parameters" #使用$*代表所有的参数 echo "The parameter is:$*" #使用$@也代表所有参数 echo "The parameter is:$@"
验证:
[root@localhost tmp]# ./param3.sh 1 2 3 4 5 A total of 5 parameters The parameter is:1 2 3 4 5 The parameter is:1 2 3 4 5
例4:$*与$@的区别
[root@localhost sh]# vim param4.sh #!/bin/bash # $*中所有参看成是一个整体,所以for只执行一次 for i in "$*" do echo "The parameter is:$i" done # $@中每个参数都看成是独立的,会循环多次 x=1 for y in "$@" do echo "The parameter $x is:$y" x=$(( $x + 1 )) done
验证:
[root@localhost sh]# ./param4.sh 1 2 3 4 5 The parameter is:1 2 3 4 5 The parameter 1 is:1 The parameter 2 is:2 The parameter 3 is:3 The parameter 4 is:4 The parameter 5 is:5
4. 预定义变量
1)
预定义变量 |
作用 |
$? |
shell中最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确 |
$$ |
当前进程的进程号(PID) |
$! |
后台运行的最后一个进程的进程号(PID) |
逻辑"&&"和"||"可以通过$?来判断是否正确。
例:编写variable.sh脚本
[root@localhost sh]# vim variable.sh #!/bin/bash #输出当前进程PID,该PID即为variable.sh脚本执行时,生成的进程的PID echo "The current process is $$" # &可以将命令放入后台 find /root -name hello.sh & echo "The last one Daemon process is $!"
验证:
[root@localhost sh]# ./variable.sh The current process is 1617 The last one Daemon process is 1618
2)read:接收键盘的输入,其格式为:
read [选项] [变量名]
其中,-p "提示信息":在等待read输入时,输出提示信息;
-t 秒数:read命令会一直等待用户输入,使用此选项,可指定等待时间;
-n 字符数:read命令只接受指定的字符数;
-s:隐藏输入的数据,适用于机密信息的输入。
例:
[root@localhost sh]# vim readtest.sh #!/bin/bash # 提示"请输入姓名"并等待30s,把用户的输入保存入变量 read -t 30 -p "Please input your name:" name echo "name is $name" # 使用-s选项隐藏输入年龄 read -t 30 -s -p "Please enter your age:" age echo -e "\n" echo "age is $age" # 使用-n 1选项只接收一个输入字符就会执行(不用输入回车) read -n 1 -t 30 -p "Please select your gender [M/F]:" gender echo -e "\n" echo "sex is $gender"
验证:
[root@localhost sh]# ./readtest.sh Please input your name:ws name is ws Please enter your age: age is 26 Please select your gender [M/F]:M sex is M
5. Bash的运算符
(1)数值运算与运算符
1)declare声明变量类型,其格式为:
declare [+/-] [选项] 变量名
其中,"-"选项表示给变量设定类型属性,"+"选项表示取消变量的类型属性,-i选项表示将变量声明为整数型,-x选项表示将变量声明为环境变量,-p选项显示指定变量被声明的类型。
例1:
# 定义变量aa和bb [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 # 声明变量cc,并保存aa和bb的和 [root@localhost ~]# declare -i cc="$aa"+"$bb" # 显示cc的类型 [root@localhost ~]# declare -p cc declare -i cc="33" # 取消cc的类型属性 [root@localhost ~]# declare +i cc [root@localhost ~]# declare -p cc declare -- cc="33"
例2:expr或let数学运算工具(使用较少)
# 给变量aa和bb赋值 [root@localhost ~]# aa=11 [root@localhost ~]# bb=22 # dd为aa和bb的和,且注意"+"左右两侧必须有空格 [root@localhost ~]# dd=$(expr "$aa" + "$bb") [root@localhost ~]# echo $dd 33
例3:"$(( 运算式 ))"或"$[ 运算式 ]"(使用较多)
[root@localhost ~]# aa=11 [root@localhost ~]# bb=22 [root@localhost ~]# ee=$(( $aa+$bb )) [root@localhost ~]# echo $ee 33 [root@localhost ~]# ff=$[ $aa+$bb ] [root@localhost ~]# echo $ff 33
(2)运算符
优先级 |
运算符 |
说明 |
13 |
-,+ |
单目负、单目正 |
12 |
!,~ |
逻辑非、按位取反或补码 |
11 |
*,/,% |
乘、除、取模 |
10 |
+,- |
加、减 |
9 |
<<,>> |
按位左移、按位右移 |
8 |
<=,>=,<,> |
小于等于,大于等于,小于,大于 |
7 |
==,!= |
等于、不等于 |
6 |
& |
按位与 |
5 |
^ |
按位异或 |
4 |
| |
按位或 |
3 |
&& |
逻辑与 |
2 |
|| |
逻辑或 |
1 |
=,+=,-=,*=,/=,%=, &=,^=,|=,<<=,>>= |
赋值、运算且赋值 |
例:
# 虽然乘和除的优先级高于加,但通过小括号可调整运算的优先顺序 [root@localhost ~]# aa=$(( (11+3)*3/2 )) [root@localhost ~]# echo $aa 21 # 14不能被3整除,余数是2 [root@localhost ~]# bb=$(( 14%3 )) [root@localhost ~]# echo $bb 2 # 逻辑与运算 [root@localhost ~]# cc=$(( 1&&0 )) [root@localhost ~]# echo $cc 0
(3)变量测试与内容替换
变量置换方式 |
变量y没有设置 |
变量y为空值 |
变量y设置值 |
x=${y-新值} |
x=新值 |
x为空 |
x=$y |
x=${y:-新值} |
x=新值 |
x=新值 |
x=$y |
x=${y+新值} |
x为空 |
x=新值 |
x=新值 |
x=${y:+新值} |
x为空 |
x为空 |
x=新值 |
x=${y=新值} |
x=新值 y=新值 |
x为空 y值不变 |
x=$y y值不变 |
x=${y:=新值} |
x=新值 y=新值 |
x=新值 y=新值 |
x=$y y值不变 |
x=${y?新值} |
新值输出到标准错误输出(即屏幕) |
x为空 |
x=$y |
x=${y:?新值} |
新值输出到标准错误输出 |
新值输出到标准错误输出 |
x=$y |
例:变量测试:x=${y-新值}
[root@localhost ~]# x=${y-new} [root@localhost ~]# echo $x new [root@localhost ~]# y="" [root@localhost ~]# x=${y-new} [root@localhost ~]# echo $x [root@localhost ~]# y=234 [root@localhost ~]# x=${y-new} [root@localhost ~]# echo $x 234
6. 环境变量配置文件
(1)简介
1)source命令--环境变量配置文件的内容需要重新登录才能生效,source命令的作用是让其直接生效,无需重新登录。其格式为:
source 配置文件 或 . 配置文件
注意:.与配置文件中间有空格,且.的作用即为source的作用。
2)环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,如:PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量。
系统中的环境变量配置文件主要有:
/etc/profile ; /etc/profile.d/*.sh ; ~/.bash_profile ; ~/.bashrc ; /etc/bashrc
(2)作用
环境变量配置文件的先后调用顺序如下图所示:
1)/etc/profile的作用有:USER变量;LOGNAME变量;MAIL变量;PATH变量;HOSTNAME变量;HISTSIZE变量;umask;调用/etc/profile.d/*.sh文件;
2)~/.bash_profile的作用: 调用了~/.bashrc文件;在PATH变量后面加入了":$HOME/bin"目录;
3)~/.bashrc的作用:定义默认别名;调用/etc/bashrc;
4)/etc/bashrc的作用:PS1变量;umask变量;PATH变量;调用/etc/profile.d/*sh文件。注意:与/etc/profile不同,/etc/bashrc针对的是没有登录的shell,即不用输入用户名、密码,直接在shell中进行用户切换的情景。
(3)其他配置文件和登录信息
1)注销时生效的环境变量配置文件:~/.bash_logout;
2)其他配置文件:~/bash_history,当系统出现错误时,一个重要的排错手段;
3)shell登陆信息:
对于本地终端欢迎信息:/etc/issue
转义符 |
作用 |
\d |
显示当前系统日期 |
\s |
显示操作系统名称 |
\l |
显示登录的终端号,比较常用 |
\m |
显示硬件体系结构,如i386,i686等 |
\n |
显示主机名 |
\o |
显示域名 |
\r |
显示内核版本 |
\t |
显示当前系统时间 |
\u |
显示当前登录用户的序列号 |
Linux本地支持6个本地字符终端,用Alt+F1~F6进行切换,则可通过\l显示当前登录的是哪个终端。
注意:/etc/issue只对本地登录有效,对远程登录没有作用。
远程终端的欢迎信息:/etc/issue.net,转义符在该文件中不能使用,是否显示此欢迎信息,是由ssh的配置文件(/etc/sshd/sshd_configure)决定的,在该文件中找到"Banner"子串,然后加入"Banner /etc/issue.net"行才能显示。写完之后记得输入service sshd restart命令进行重启ssh服务。
登陆后的欢迎信息:/etc/motd,不管是本地登录还是远程登录,都可以显示此欢迎信息。