1.变量值的调换
//定义两个变量
a=10
b=20
//将变量a、变量b数值进行调换
c=$a
a=$b
b=$c
2.if语句
if 语句
if [ 表达式 ]
if test 表达式
if 命令
if语句做判断实际上就是看后面的表达式或者命令的状态码。状态码为0
时成立就执行do后面的命令,状态码为1
时不成立就执行else语句。
if语句也可以不另换行输出,直接跟着if后面,表现形式如下
if [ 表达式 ];then 代码块1; 代码块2; fi
3.case语句
case 变量值($变量) in
模式1)
代码块1
;;
模式2)
代码块2
;;
*)
代码块3
;;
esac
case语句中的模式表达式可以为字符串,也可以为通配符。其中通配符表现形式如下:
9[0-9]) #90-99区间的模式
...
[6-8][0-9]) #60-89区间的模式,其中[6-8]也可以写为[678]
...
[0-9]|[1-5][0-9] #0-59区间的模式,|前面的表示0-9区间,|表示或,|后面的表示10-59区间
...
4.退出循环
- break:默认用于退出单层循环
- continue:用于终止某次循环的执行continue之后的代码块
- exit:退出当前脚本的执行,还可以定义返回状态码
5.获取字符串的用法
awk命令获取字符串
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 3770 606 2765 20 399 2911
Swap: 5721 0 5721
[root@localhost ~]# free -m | grep Mem | awk '{print $3}'
606
如果想要获取ip地址中某一段的值,具体操作如下:
[root@localhost ~]# echo '192.168.145.10' | awk -F. '{print $3}' #由于awk默认只能分隔空格,如果想要指定分隔符用-F
145
echo命令获取字符串
[root@localhost ~]# i='192.168.145.10'
[root@localhost ~]# echo ${i:0:3}
192
其中echo命令还可以通过删除其余字段来获取想要的字段:
[root@localhost ~]# i='192.168.145.10'
[root@localhost ~]# echo ${i%%.*} #获取i的值,然后从后往前删,一直删到最后一个点
192
[root@localhost ~]# echo ${i%.*} #获取i的值,然后从后往前删,一直删到第一一个点
192.168.145
[root@localhost ~]# echo ${i##*.} #获取i的值,然后从前往后前删,一直删到最后一个点
10
[root@localhost ~]# echo ${i#*.} #获取i的值,然后从后往前删,一直删到第一一个点
168.145.10
6.逐行读取
for命令获取逐行读取
[ root@localhost ~]# for a in $(cat abc.txt)
> do
> echo $a
> done
11
22
33
44
55
66
77
88
99
whie read 获取逐行读取
[root@localhost ~]# while read b
> do
> echo $b
> done < abc.txt
11
22
33
44
55
66
77
88
99
7.例题
猴子摘下了n个香蕉,当天吃掉一半多一个,第二天也是吃掉剩下香蕉一半多一个,到了第十天,香蕉只剩下了1个。问:猴子第一天摘了多少香蕉?
[root@localhost ~]# vim banana.sh
#!/bin/bash
n=1
for((i=9;i>0;i--))
do
n=$[(n+1)*2]
done
echo "猴子第一天摘了${n}根香蕉"
[root@localhost ~]# bash banana.sh
猴子第一天摘了3070根香蕉
求斐波拉切数前10位以及前10位的总和(斐波拉切数:从数列开始,第三个数等于前两个数之和)
[root@localhost ~]# vim sum.sh
#!/bin/bash
n=1
m=1
sum=0
for((i=1;i<=10;i++))
do
echo -ne "$n\t"
j=$[m+n]
let sum+=$n
n=$m
m=$j
done
echo "前10个数总和为$sum"
[root@localhost ~]# bash sum.sh
1 1 2 3 5 8 13 21 34 55
前10个数总和为143
字符切片与随机生成密码的应用
[root@localhost ~]# a='1234567890'
[root@localhost ~]# echo $a
1234567890
[root@localhost ~]# echo ${a}
1234567890
[root@localhost ~]# echo ${#a} #字符串长度
10
[root@localhost ~]# echo ${a:3:3} #第一个a表示想要获取的字符串;第二个3表示坐标,坐标从0开始;第三个3表示想要获取字符串的长度为3个数
456
[root@localhost ~]# echo $[RANDOM % ${#a}] #随机生成10以内的数作为下标值
7
[root@localhost ~]# echo $[RANDOM % ${#a}]
4
[root@localhost ~]# tmp=$[RANDOM % ${#a}]
[root@localhost ~]# echo ${a:tmp:1} #随机生成10以内的数
2
[root@localhost ~]# num=2
[root@localhost ~]# b=6
[root@localhost ~]# num=$num$b #字符串的追加
[root@localhost ~]# echo $num
25
[root@localhost ~]# b=7
[root@localhost ~]# num=$num$b
[root@localhost ~]# echo $num
257
[root@localhost ~]# vim passwd.sh
#!/bin/bash
str='1234567890'
for((i=1;i<=8;i++))
do
a=$[RANDOM % ${#str}]
tmp=${str:a:1}
passwd=$passwd$tmp
done
echo "随机生成一个密码为:${passwd}"
[root@localhost ~]# bash passwd.sh
随机生成一个密码为:22869930
[root@localhost ~]# bash passwd.sh
随机生成一个密码为:71619535
[root@localhost ~]# bash passwd.sh
随机生成一个密码为:06064462
求0~255之间的数字(余数倒排法)
[root@localhost ~]# vim ip.sh
#!/bin/bash
read -p "请输入0-255之间的数字:" num
for((i=1;i<=8;i++))
do
a=$[num % 2]$a #通过取余从后向前赋值
let num=$[num / 2]
done
echo $a
[root@localhost ~]# bash ip.sh
请输入0-255之间的数字:192
11000000
求0~255之间的数字(减法正排法)
[root@localhost ~]# vim ip.sh
#!/bin/bash
read -p "请输入0-255之间的数字:" num
for i in {128,64,32,16,8,4,2,1}
do
a=$[num-i]
if [ $a -lt 0 ] #判断各个位数是否能被i的取值列表减
then
echo -n 0
else
echo -n 1
let num-=i
fi
done
echo ''
[root@localhost ~]# bash ip.sh
请输入0-255之间的数字:192
11000000
分隔文件每20行输出
[root@localhost ~]# vim test.sh
#!/bin/bash
#定义记录行数的变量
a=0
#定义分割的文件序号标识
b=1
IFS_OLD=$IFS #先将IFS赋给IFS_OLD,作为临时修改IFS的值
IFS=$'\n' #然后修改IFS的值为换行符
for i in $(cat anaconda-ks .cfg)
do
let a++ #记录行数
c=$[a % 20] #每20行一分割,当余数不为零就不足20行
if [ $c -eq 0 ];then #判断当余数是否为零,为0就正好20行,不为0就不足20行
echo $i >> ks.cfg-$b #如果满20行,则分隔文件
let b++
else
echo $i >> ks.cfg-$b
fi
done
IFS=$IFS_OLD #再将IFS赋值回初始值,防止其他脚本文件出错
[root@localhost ~]#bash test.sh
ks.cfg-1 ks.cfg-2 ks.cfg-3 ks.cfg-4
其中for循环分隔会包含空格、换行符和制表符,如果一行字符串有多个空格间隔,则分割时会视为多行输出。如果只想修改当前脚本只以换行符作为分割,可以修改IFS
[root@localhost ~]# set | grep IFS
IFS=$' \t\n'
local i IFS='
local i IFS=" "'
local i IFS=" "'
local i IFS='
local i IFS='
local c i=0 IFS='
local IFS='
local IFS='
local option option2 i IFS='
IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local IFS='
local i IFS='
local IFS='
local i c='' IFS='
local OIFS=$IFS IFS='
IFS=$OIFS;
local IFS='
local IFS='
local IFS='
local IFS='