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循环也支持breakcontinue
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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐