Shell编程语法
shell编程的语法
·
shell编程语法
一、shell语法的定义
1、shell脚本优势
批量处理,自动化
减少人为失误
2、shell底层的实现原理
shell底层也是用c语言实现的,--可以实现操控操作系统
3、shell的种类:
1.sh
2.bash
3.ksh
二、shell的基本语法–for循环
1、语法一:
for 变量 in 值1 值2
do
循环执行语句
done
案例:
[root@xiaoliu shell_test]# cat test.txt
aa xx
123423
lhj
abc
[root@xiaoliu shell_test]# vim for1.sh
[root@xiaoliu shell_test]# bash for1.sh
aa
xx
123423
lhj
abc
[root@xiaoliu shell_test]# cat for1.sh
#!/bin/bash
for i in `cat test.txt`
do
echo $i
done
2.语法二:
#for ((i=0;i<3;i++))
for ((初始化变量; 结束循环的条件; 运算))
do
循环执行的语句
done
案例:
for ((i=0;i<3;i++))
do
echo $i
done
for i in `seq 1 2 20`
do
echo $i
done
for i in {1..10}
do
echo $i
done
三、seq命令:打印出一串序列 --》有序的数字
seq [OPTION]... LAST
seq [OPTION]... FIRST LAST
seq [OPTION]... FIRST INCREMENT LAST
INCREMENT 增长--》步长值
默认步长值为1
步长值可以指定
1.用法
[root@xiaoliu lianxi]# seq 5
1
2
3
4
5
[root@xiaoliu lianxi]# seq 5 10
5
6
7
8
9
10
[root@xiaoliu lianxi]# seq 5 2 10
5
7
9
2.重要选项:
-s 指定分隔符
-w 等宽输出
用0填充达到宽度一样
案例:
[root@xiaoliu lianxi]# seq -w 1 10
01
02
03
04
05
06
07
08
09
10
[root@xiaoliu lianxi]# seq -s "+" 1 10
1+2+3+4+5+6+7+8+9+10
[root@xiaoliu lianxi]# seq -s " " 1 10
1 2 3 4 5 6 7 8 9 10
3.seq主要是和for循环配合使用,用来控制for循环的次数
$(命令) --》得到命令执行的结果
将seq 5命令执行的结果赋值给变量怒num,保存了命令执行的结果,方便后面的脚本使用
[root@xiaoliu lianxi]# num=$(seq 5)
[root@xiaoliu lianxi]# echo $num
1 2 3 4 5
四、read命令: 接收用户标准输入
1.用法:
[root@xiaoliu shell_test]# read -p "请输入用户数字:" num1
请输入用户数字:43
[root@xiaoliu shell_test]# echo $num1
43
[root@xiaoliu shell_test]# echo asfd
asfd
[root@xiaoliu shell_test]# echo num1
num1
[root@xiaoliu shell_test]# read a b
sadfad
[root@xiaoliu shell_test]# echo $a
sadfad
[root@xiaoliu shell_test]# echo $b
[root@xiaoliu shell_test]# echo $?
0
[root@xiaoliu shell_test]# read a b c
xx yy zz dd fff
[root@xiaoliu shell_test]# echo $a
xx
[root@xiaoliu shell_test]# echo $b
yy
[root@xiaoliu shell_test]# echo $c
zz dd fff
[root@xiaoliu shell_test]#
五、shell的基本语法–while循环
1.定义:
1.
while read line
do
循环执行语句
done
2.
while 条件:
do
循环执行语句
done
2.例子:
#!bin/bash
while read line
do
echo "这一行为"$line
done < test.txt
#!bin/bash
cat test.txt|while read line
do
echo "这一行为"$line
done
注意:此语法中,while循环也支持break和continue
3.小练习:
需求:
#有一个fuwu.txt文本,文本内容如下
[root@zabbix-agent-nginx shell-test]# cat fuwu.txt
IP AREA QUFU
192.168.0.1 HUNAN 2 89 60
192.168.1.1 HUNAN 3
192.168.3.1 HUBEI 4 9 10
192.168.4.1 HAINAN 56 34
192.168.5.1 HUHUA 8
输出每一个HUNAN地区的ip和qufu的映射关系
192.168.0.1的区服为:2
192.168.0.1的区服为:89
192.168.0.1的区服为:60
192.168.1.1的区服为:3
答案:
方法一:
#!bin/bash
cat fuwu.txt|grep "HUNAN"|while read a b c
do
for i in $c
do
echo $a"的区服为:"$i
done
done
方法二:
#!bin/bash
while read ip name qufu
do
if [ $name == "HUNAN" ]
then
for i in $qufu
do
echo $ip"的区服为:"$i
done
fi
done < fuwu.txt
六、shell基本语法–if语句
1.if语句的三种格式
1.
if 条件
then
执行语句
fi
2.
if 条件
then
执行语句
else
执行语句
fi
3.
if [ command ];then
符合该条件执行的语句
elif [ command ];then
符合该条件执行的语句
else
符合该条件执行的语句
fi
2.[ ]表示条件测试。注意这里的空格很重要。要注意在’[‘后面和’]'前面都必须要有空格。
2.1常用判断:
[ -d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
案例:
#!bin/bash
if [ -f test.txt ]
then
echo "文件已存在"
else
echo "文件不存在"
fi
if id sc &>/dev/null
then
echo "sc已存在"
else
echo "sc不存在"
fi
2.2字符串判断:
[ -z STRING ] 如果STRING的长度为零则返回为真,即空是真
[ -n STRING ] 如果STRING的长度非零则返回为真,即非空是真
[ STRING1 ] 如果字符串不为空则返回为真,与-n类似
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
[ STRING1 != STRING2 ] 如果字符串不相同则返回为真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面则返回为真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面则返回为真。
2.3 数值判断:
[ INT1 -eq INT2 ] INT1和INT2两数相等返回为真 ,=
[ INT1 -ne INT2 ] INT1和INT2两数不等返回为真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回为真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回为真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回为真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回为真,<=
2.4 逻辑判断:
[ ! EXPR ] 逻辑非,如果 EXPR 是false则返回为真。
[ EXPR1 -a EXPR2 ] 逻辑与,如果 EXPR1 and EXPR2 全真则返回为真。
[ EXPR1 -o EXPR2 ] 逻辑或,如果 EXPR1 或者 EXPR2 为真则返回为真。
[ ] || [ ] 用OR来合并两个条件
[ ] && [ ] 用AND来合并两个条件
3.整数类型的比较:
if [ 123 -gt 22 ]
then
echo "大于"
else
echo "小于"
fi
if (( 123 > 22 ))
then
echo "大于"
else
echo "小于"
fi
4.小数运算:
[root@xiaoliu shell_test]# echo "3.2+6.2"|bc
9.4
[root@xiaoliu shell_test]# echo "6>3"|bc
1 1表示为真,0表示为假
[root@xiaoliu shell_test]# echo "6.7>3"|bc
1
[root@xiaoliu shell_test]# echo "6.7<3"|bc
0
5.整数运算
5.1 第一种: $(( 表达式 ))
5.2 第二种: $[ 表达式 ]
5.3 第三种: expr 表达式
5.4 第四种: let
[root@xiaoliu ~]# a=$(( 3+2 ))
[root@xiaoliu ~]# echo $a
5
[root@xiaoliu ~]# let a=3+4
[root@xiaoliu ~]# echo $a
7
[root@xiaoliu ~]# echo $[ 30 + 40 ]
70
[root@xiaoliu ~]# a=20
[root@xiaoliu ~]# b=55
[root@xiaoliu ~]# echo $[ $a + $b ]
75
[root@xiaoliu ~]# expr $a+$b
20+55
[root@xiaoliu ~]# expr $a + $b
75
6.一个[]和[[]]的区别:
[] 碰到空白会进行分词
[[]] 引号内的字符串不会进行分词
[root@xiaoliu shell_test]# name="sc tl"
[root@xiaoliu shell_test]# [ $name == "sc tl" ]
-bash: [: 参数太多
[root@xiaoliu shell_test]# [[ $name == "sc tl" ]]
七、在centos里面同步时间
1.安装chrony软件
yum install -y chrony
2.重启整个服务
systemctl restart chronyd
3.设置开机自启动
systemctl enable chronyd
八、case语句
1、case语句的结构:
case语句:
case $变量 in
value1)
语句体
;;
value2)
语句体
;;
*)
语句体
;;
esac
2、小练习
用case语句实现输入两个整数,选择对这两个整数进行加减乘除运算,输入p就退出
#!bin/bash
read -p "请输入第一个整数:" num1
read -p "请输入第二个整数:" num2
echo "1、加法 2、减法 3、乘法 4、除法"
while true
do
read -p "请输入你想要执行的操作(按q退出):" option
case $option in
1)
echo $(( $num1+$num2 ))
;;
2)
echo $(( $num1-$num2 ))
;;
3)
echo $(( $num1*$num2 ))
;;
4)
echo $(( $num1/$num2 ))
;;
q)
break
;;
esac
done
九、shell里面的数组
1、定义:使用圆括号,中间以空格作为分隔符
#定义一个数组
[root@mysql-binary shell_test]# a=(xx yy zz ff)
#直接用$a查看的是数组里面的第一个元素
[root@mysql-binary shell_test]# echo $a
xx
#查看数组里面所有的元素
[root@mysql-binary shell_test]# echo ${a[*]}
xx yy zz ff
[root@mysql-binary shell_test]# echo ${a[@]}
xx yy zz ff
#对数组进行切片时,不能用a,要用整个数组里的所有元素进行切片
[root@mysql-binary shell_test]# echo ${a:1:3}
x
[root@mysql-binary shell_test]# echo ${a[*]:1:3}
yy zz ff
#查看数组的长度
[root@mysql-binary shell_test]# echo ${#a[*]}
4
[root@mysql-binary shell_test]# echo ${#a[@]}
4
#修改数组元素的值
[root@mysql-binary shell_test]# a[3]="hh"
[root@mysql-binary shell_test]# echo ${a[*]}
xx yy zz hh
#删除数组下标为3的元素
[root@mysql-binary shell_test]# unset a[3]
[root@mysql-binary shell_test]# echo ${a[*]}
xx yy zz
#删除数组下标为1的元素
[root@mysql-binary shell_test]# unset a[1]
[root@mysql-binary shell_test]# echo ${a[*]}
xx zz
#查看下标
[root@mysql-binary shell_test]# echo ${!a[*]}
0 2
#删除下标为2的元素
[root@mysql-binary shell_test]# unset a[2]
[root@mysql-binary shell_test]# echo ${a[*]}
xx
十、在shell里产生随机数
1、用到了RANDOM函数,范围是0-32767:
[root@xiaoliu lianxi]# echo $RANDOM
28727
2、产生10以内的随机数
[root@xiaoliu lianxi]# echo $(( $RANDOM%10 ))
6
3、产生150-200之间的随机
[root@xiaoliu lianxi]# echo $(( $RANDOM%50+150 ))
165
4、小练习
随机产生12盏灯的灯亮和灯灭情况(灯亮:1,灯灭:0),保存在数组里面,
随机去打灯,随机挑选一个下标,取值如果为1,就表示“灯亮,赢了”,如果为0,就表示“灯灭”
#!bin/bash
a=()
for i in {1..12}
do
num1=$(( $RANDOM%2 ))
a[$i]=$num1
done
echo ${a[*]}
lucky_num=$(( $RANDOM%12+1 ))
echo $lucky_num
if [ ${a[$lucky_num]} == 1 ]
then
echo "灯亮,赢了"
else
echo "灯灭,输了"
fi
更多推荐
已为社区贡献6条内容
所有评论(0)