7月31日 bash脚本编程基础2

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) 定义本地变量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容