1、算术运算
bash中的算术运算:可以查帮助 help let
+, -, *, /, %取模(取余), **(乘方)
[root@centos7 ~]#a=10
[root@centos7 ~]#b=20
[root@centos7 ~]#let c=a+b --第一种方法
[root@centos7 ~]#echo $c
30
[root@centos7 ~]#a=30
[root@centos7 ~]#b=10
[root@centos7 ~]#c=$[a+b] ---第二种方法
[root@centos7 ~]#echo $c
40
[root@centos7 ~]#c=$((a*b)) ---第三种方法
[root@centos7 ~]#echo $c
300
[root@centos7 ~]#c=$[a-b]
[root@centos7 ~]#echo $c
20
[root@centos7 ~]#expr 1 + 2 ---第四种方法,注意中间要有空格隔开
3
[root@centos7 ~]#expr 6 / 2
3
[root@centos7 ~]#expr 2 \* 2 ---乘法要加上转意符
4
[root@centos7 ~]#a=30
[root@centos7 ~]#expr 0 + $a
30
[root@centos7 ~]#expr 8 + -10
-2
[root@centos7 ~]#expr 0 + 0 ---结果为假
0
[root@centos7 ~]#echo $?
1
[root@centos7 ~]#expr 1 + -1 ---结果为假
0
[root@centos7 ~]#echo $?
1
[root@centos7 ~]#declare -i x ---声明变量为整数
[root@centos7 ~]#x=10
[root@centos7 ~]#declare -i y
[root@centos7 ~]#y=20
[root@centos7 ~]#z=x+y ---如果不声明z,则无法进行算术运算
[root@centos7 ~]#echo $z
x+y
[root@centos7 ~]#declare -i z ---声明z是整数后就可以进行算术运算了
[root@centos7 ~]#z=x+y
[root@centos7 ~]#echo $z
30
[root@centos7 ~]#declare -i x
[root@centos7 ~]#x=abc ---这种方法有个缺点,就二十不一定是整数,x=abc 是个字符串,结果也是真。
[root@centos7 ~]#echo $?
0
总结:用expr 0+ $a && echo $a is integer;可以用来判断$a是否为非0的整数,包括负数。
bash有内建的随机数生成器:$RANDOM(0-32767)
echo $[RANDOM%50] :0-49之间随机数
2、赋值
[root@centos7 ~]#i=5
[root@centos7 ~]#let j=++i
[root@centos7 ~]#echo $j
6
[root@centos7 ~]#i=5
[root@centos7 ~]#let j=i++
[root@centos7 ~]#echo $j
5
总结:++i表示先相加再赋值,i++表示先赋值再相加。
增强型赋值:
+=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
自加3后自赋值
自增,自减:
let var+=1
let var++
let var-=1
let var--
3、逻辑运算
- 短路与 cmd1&&cmd2
cmd1为真,将执行cmd2,cmd2为假,则结果为假,cmd2为真,则结果为真
cmd1为假,则结果为假,不执行cmd2 - 短路或 cmd1||cmd2
cmd1为真,则不执行cmd2,结果为真
cmd1为假,则执行cmd2,cmd2为真,则结果为真,cmd2为假,则结果为假 - 异或 ^
相同为假,不同为真
①短路与和短路或
[root@centos7 test]#cat name.sh
#!/bin/bash
##################################
#Filename:name.sh
#Description:
#Date:2017-07-31
#Author:zhangdazhi
#Version:2.0
#####################################
name="laoma"
id $name &> /dev/null && { echo $name is exist ; exit 100; }||{ useradd $name ; echo $name is created;echo magedu |passwd --stdin $name &>/dev/null; } ---用大括号表示的是一个整体,并且不开子进程,需要注意的是大括号前后要有空格,并且最后结束的时候要有分号
echo script is finished
[root@centos7 test]#./name.sh
laoma is created
script is finished
[root@centos7 test]#./name.sh
laoma is exist
②异或
[root@centos7 ~]#a=10;b=6
[root@centos7 ~]#c=$a;a=$b;b=$c
[root@centos7 ~]#echo $a;echo $b
6
10
[root@centos7 ~]#a=10;b=6
[root@centos7 ~]#a=$[a^b];b=$[a^b];a=$[a^b] ---异或的结果跟b异或就是a,异或的结果跟a异或就是b
[root@centos7 ~]#echo $a;echo $b
6
10
4、条件测试
测试命令:
•test EXPRESSION
•[ EXPRESSION ]
•[[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符
[root@centos7 ~]#test "$var" && echo ture
[root@centos7 ~]#var="" ---代表var为空
[root@centos7 ~]#test "$var" && echo ture
[root@centos7 ~]#var=" " ---代表var为空格
[root@centos7 ~]#test "$var" && echo ture
ture
[root@centos7 ~]#test 0 &&echo ture
ture
[root@centos7 ~]#[ -n "$abc" ]&&echo true
[root@centos7 ~]#[ -z "$abc" ]&&echo true ---空为真,因为abc没有赋值。
true
[root@centos7 ~]#[ -n "$abc" ]||echo fault ---非空为真,空为假
fault
总结:用test进行判断时非空才为真。
5、数值测试
-gt是否大于
-ge是否大于等于
-eq是否等于
-ne是否不等于
-lt是否小于
-le是否小于等于
ping -c1 -w1 172.18.0.1 &>/dev/null && echo up ||echo down --c1代表ping一次,w1表示一次一秒
6、字符串测试
==是否等于
!=是否不等于
ascii码是否大于ascii码
<是否小于
=~左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
-z "STRING“字符串是否为空,空为真,不空为假
-n "STRING“字符串是否不空,不空为真,空为假
注意:用于字符串比较时的用到的操作数都应该使用引号
[root@centos7 ~]#str=abc;[[ "$str" =~ ^a ]] && echo ture
ture
[root@centos7 ~]#str=abc;[[ "$str" =~ "^a" ]] && echo ture ---
总结:用[[ ]]表示扩展的正则表达式时,正则表达式不能加双引号,否则无效。
①判断是否为数字
[root@centos7 test]#num=-8
[root@centos7 test]#[[ "$num" =~ ^-?[0-9]+$ ]] && echo $num is number ||echo $num is not number
-8 is number
[root@centos7 test]#num=8
[root@centos7 test]#[[ "$num" =~ ^-?[0-9]+$ ]] && echo $num is number ||echo $num is not number
8 is number
[root@centos7 test]#num=abc
[root@centos7 test]#[[ "$num" =~ ^-?[0-9]+$ ]] && echo $num is number ||echo $num is not number
abc is not number
②判断是否为.sh结尾的文件
[root@centos7 test]#file=f1.sh
[root@centos7 test]#[[ "$file" =~ .*\.sh$ ]]&&echo script ||echo not script
script
[root@centos7 test]#file=ffff
[root@centos7 test]#[[ "$file" =~ .*\.sh$ ]]&&echo script ||echo not script
not script
7、存在性测试
-a FILE:判断文件是否存在
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或-L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
[root@centos7 app]#ls
f1 music music.sh passwd test
[root@centos7 app]#[ -a f1 ] ---判断文件是否存在
[root@centos7 app]#echo $?
0
[root@centos7 app]#[ -b /dev/sda ]&&echo block
block
[root@centos7 app]#[ -b /dev/cdrom ]&&echo block
block
[root@centos7 app]#ll /dev/cdrom
lrwxrwxrwx. 1 root root 3 Jul 31 07:49 /dev/cdrom -> sr0
[root@centos7 app]#[ -L /dev/cdrom ]&&echo soft
soft
总结:判断一个文件之前,先判断这个文件是否为软连接文件,否则判断不准确。
8、文件权限测试
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
文件特殊权限测试:
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
[root@centos7 app]#touch f1.sh
[root@centos7 app]#ls
f1 f1.sh music music.sh passwd test
[root@centos7 app]#ll
total 16
-rwxr-xr-x. 1 root root 26 Jul 31 09:16 f1
-rw-r--r--. 1 root root 0 Jul 31 22:20 f1.sh
drwxr-xr-x. 2 root root 4096 Jul 22 15:58 music
-rwxr-xr-x. 1 root root 510 Jul 22 16:02 music.sh
-rw-r--r--. 1 root root 2232 Jul 30 11:02 passwd
drwxr-xr-x. 4 root root 199 Jul 31 21:45 test
[root@centos7 app]#file=f1.sh;[[ $file =~ .*\.sh$ ]]&&[ ! -x $file ]&&chmod a+x $file
---线判断这个文件是否是以.sh结尾的文件,如果是,再判断是否没有执行权限,如果没有执行权限则加一个执行权限
[root@centos7 app]#ls
f1 f1.sh music music.sh passwd test
总结:进行判断时可以查看help test,里面有更详细的信息。
9、使用read来把输入值分配给一个或多个shell变量
[root@centos7 app]#read -p "please input your name: " name
please input your name: mage
[root@centos7 app]#echo $name
mage
[root@centos7 app]#ANS=yes;[[ $ANS =~ ^[Yy][Ee][Ss]|[Yy]$ ]]&& echo yes
yes
[root@centos7 app]#ANS=Yes;[[ $ANS =~ ^[Yy][Ee][Ss]|[Yy]$ ]]&& echo yes
yes
[root@centos7 app]#ANS=YEs;[[ $ANS =~ ^[Yy][Ee][Ss]|[Yy]$ ]]&& echo yes
yes
[root@centos7 app]#ANS=YE;[[ $ANS =~ ^[Yy][Ee][Ss]|[Yy]$ ]]&& echo yes
[root@centos7 app]#ANS=Y;[[ $ANS =~ ^[Yy][Ee][Ss]|[Yy]$ ]]&& echo yes
yes
10、bash的配置文件
- 按生效范围划分,存在两类:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc - shell的两种登录方式
交互式登录:
(1)直接通过终端输入账号密码登录
(2)使用“su-UserName”切换的用户
执行顺序:/etc/profile --> /etc/profile.d/.sh --> ~/.bash_profile--> ~/.bashrc--> /etc/bashrc
非交互式登录:
(1)suUserName
(2)图形界面下打开的终端
(3)执行脚本
(4)任何其它的bash实例
执行顺序:~/.bashrc--> /etc/bashrc--> /etc/profile.d/.sh - 按功能划分,存在两类:
profile类和bashrc类
profile类:为交互式登录的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
功用:
(1) 用于定义环境变量
(2) 运行命令或脚本
bashrc类:为非交互式和交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量