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) 定义本地变量
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容