大家好,欢迎来到IT知识分享网。
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 lhj abc [root@xiaoliu shell_test]# vim for1.sh [root@xiaoliu shell_test]# bash for1.sh aa xx 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.整数运算
[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
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/110932.html