@[toc]
一、说明:
打算从B站学习一下shell编程,从很多的课程视频中,挑选了一个:
B站视频地址:
打算开始学习着做着笔记:
这个需要一些Linux基础,还有vim的,如果不太熟练,可以看下我之前的整理的俩个博客:
1、整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
2、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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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[@]}" |
运行结果: