@[toc]

一、说明:

打算从B站学习一下shell编程,从很多的课程视频中,挑选了一个:
B站视频地址
打算开始学习着做着笔记:
这个需要一些Linux基础,还有vim的,如果不太熟练,可以看下我之前的整理的俩个博客:

1、整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)

整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)

2、Linux下vim/vi 编辑器 命令总结

Linux下vim/vi 编辑器 命令总结

3、学习课件:

这个地址我直接把B站中评论下方分享的弄出来了,如果失效,可以下方评论,我把我下载的分享给你。
下载地址

4、之前的博客:

shell编程学习笔记之–学习第一天
shell编程学习笔记之–学习第二天
shell编程学习笔记之–学习第三天

二、实战演练:

1、Until 循环语句

1、语法格式

1
until  条件
2
do
3
action
4
done

直到满足条件,才退出。否则执行 action 。

2、打印出从10以下的数字:

1
vi  untile_demo1.sh

敲入代码:

1
#!/bin/bash
2
#auto until demo1
3
#by authors zhaojiafu
4
5
a=10;
6
until [[ $a -lt 0 ]];
7
8
do
9
        echo -e "\033[32mThe Num is $a !\033[01"
10
        ((a--))
11
done
在这里插入图片描述
在这里插入图片描述

2、case语句:

1、格式:

1
case $arg in
2
pattern1)
3
语句 1
4
;;
5
pattern2)
6
语句 2
7
;;
8
*)
9
语句 3
10
;;
11
esac

2、LAMP简单提示选择菜单:

创建sh脚本

1
vim case_demo.sh

敲入代码:

1
#!/bin/bash
2
# auto case demo
3
# by authors zjf 2019
4
5
case $1 in
6
        Apache )
7
        echo -e "\033[32m准备安装Apache。。。·\033[0m"
8
        ;;
9
        Mysql)
10
        echo -e "\033[32m准备安装Mysql。。。·\033[0m"
11
        ;;
12
        PHP)
13
        echo -e "\033[32m准备安装PHP。。。·\033[0m"
14
        ;;
15
        *)
16
        echo -e "\033[32mUsage $0 Apache|Mysql|PHP|help\033[0m"
17
        ;;
18
esac

执行效果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、select语句:

Select 一般用于选择菜单的创建,可以配合 PS3来做菜单的打印输
出信息。

1、开源系统选择:

1
vi select_demo.sh

敲入代码:

1
#! /bin/bash
2
#by authors zhaojiafu 2019
3
4
PS3="What you like most of the open source system?"
5
6
select i in "CentOS" "RedHat" "Ubuntu"
7
8
do
9
        echo  "You select $i"
10
11
done

运行效果:

在这里插入图片描述
在这里插入图片描述

2、结合LAMP做个选择菜单:

创建sh脚本文件

1
vi select_demo2.sh

敲入代码:

1
#! /bin/bash
2
#by authors zhaojiafu 2019
3
4
PS3="Select install LAMP Menu"
5
6
select i in "Apache" "Mysql" "PHP"
7
8
do
9
10
        case $i in
11
                Apache )
12
                echo -e "\033[32m准备安装Apache。。。·\033[0m"
13
                ;;
14
                Mysql)
15
                echo -e "\033[32m准备安装Mysql。。。·\033[0m"
16
                ;;
17
                PHP)
18
                echo -e "\033[32m准备安装PHP。。。·\033[0m"
19
                ;;
20
                *)
21
                echo -e "\033[32mUsage $0 Apache|Mysql|PHP|help\033[0m"
22
                ;;
23
        esac
24
25
done

执行结果:

在这里插入图片描述
在这里插入图片描述

4、函数:(这个我看到的那个B站视频课程不对,还好有课件,看课件自己消化学习学习)

1、定义:

shell 允许将一组命令集或语句形成一个可用块,这些块称为shell 函数,定义函数的格式:

1
function name (){
2
command1
3
........
4
}
5
name

2、求俩个数的和

先测试个简单函数的调用:

1
#!/bin/bash
2
#by authors zhaojiafu 2019
3
4
function number_one () {
5
   echo "Url_1 1111"
6
   number_two
7
}
8
9
function number_two () {
10
   echo "Url_2 is 2222"
11
}
12
13
number_one
在这里插入图片描述
在这里插入图片描述
1
function sum(){
2
3
        echo `expr $1 + $2`
4
}
5
if [[ ! -z $2 ]];then
6
        echo `sum`
7
else
8
        echo "Usage: $0 num1 num2"
9
fi

求和:

1
vi 2num.sh

敲入代码:

1
#!/bin/bash
2
#by authors zhaojiafu 2019
3
4
num1=3
5
num2=4
6
7
function sum(){
8
9
        echo `expr $num1 + $num2`
10
        #return `expr $num1 + $num2`
11
        ret1=`expr $num1 + $num2`
12
        return $ret1
13
}
14
result=`sum`
15
echo "the sum is ${result}"

注意点,这个我卡了好一会,

1
return `expr $num1 + $num2`

这个再函数中不会返回结果,需要前面给个变量,然后返回变量,或者直接

1
echo `expr $num1 + $num2`

shell函数中,如果没有返回return,会把echo的所有当成字符串返回。

比如下面的代码:

1
#!/bin/bash
2
#by authors zhaojiafu 2019
3
4
num1=3
5
num2=4
6
7
function sum(){
8
        ret1=`expr $num1 + $num2`
9
        echo `expr $num1 + $num2`
10
        echo $num1
11
        echo $num2
12
        #return `expr $num1 + $num2`
13
        #ret1=`expr $num1 + $num2`
14
        #return $ret1
15
}
16
result=`sum`
17
echo "the sum is ${result}&&&&&&"

输出结果:可以看出,直接函数返回的结果是含有数字+回车+数字+回车+数字的字符串。

在这里插入图片描述
在这里插入图片描述

有return,就会只返回return的结果。

比如代码:

1
#!/bin/bash
2
#by authors zhaojiafu 2019
3
4
num1=3
5
num2=4
6
7
function sum(){
8
        ret1=`expr $num1 + $num2`
9
        echo `expr $num1 + $num2`
10
        echo $num1
11
        echo $num2
12
        #return `expr $num1 + $num2`
13
        #ret1=`expr $num1 + $num2`
14
        return $ret1
15
}
16
result=`sum`
17
echo "the sum is ${result}&&&&&&"

结果输出不对呀,还是和刚刚一样,这样return没有看出效果呀。

在这里插入图片描述
在这里插入图片描述

改写代码:

1
#!/bin/bash
2
#by authors zhaojiafu 2019
3
4
num1=3
5
num2=4
6
7
function sum(){
8
        ret1=`expr $num1 + $num2`
9
        echo `expr $num1 + $num2`
10
        echo $num1
11
        echo $num2
12
        #return `expr $num1 + $num2`
13
        #ret1=`expr $num1 + $num2`
14
        return $ret1
15
}
16
#result=`sum`
17
#echo "the sum is ${result}&&&&&&"
18
19
sum
20
result=$?
21
echo "the sum is ${result}&&&&&&"

得到了我想要的结果,所以以后如果shell中想要函数的返回结果,还是先调用,然后使用$?得到想要的return结果。如果只是调用执行一些命令,而不需要返回结果,那就怎么样都行,只要进入函数就能执行。

在这里插入图片描述
在这里插入图片描述

5、Shell 数组编程

数组,就是相同数据类型的元素按一定顺序排列的集合,就是把 有限个类型相同的变量用一个名字命名, 然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。

创建sh脚本

1
vi arr1.sh

敲入代码:

1
#!/bin/bash
2
#auto arr1
3
#by zhaojiafu 2019
4
5
A=( "语文" "数学" "英语" "物理" "化学" )
6
7
#数组的第一个元素
8
echo ${A[0]}
9
10
#数组的第2个元素
11
echo ${A[1]}
12
13
#数组的第3个元素
14
echo ${A[2]}
15
16
#数组的最后一个元素
17
echo ${A[-1]}
18
19
#数组的所以元素1
20
echo  "数组的所以元素1:${A[@]}"
21
22
#数组的所以元素2
23
echo  "数组的所以元素2:${A[*]}"
24
25
26
# 数组的长度
27
echo "数组的长度:${#A[*]}"
28
echo "数组的长度:${#A[@]}"

运行结果:

在这里插入图片描述
在这里插入图片描述