一、说明:
打算从B站学习一下shell编程,从很多的课程视频中,挑选了一个:
B站视频地址:
打算开始学习着做着笔记:
这个需要一些Linux基础,还有vim的,如果不太熟练,可以看下我之前的整理的俩个博客:
1、整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
整理一些linux命令必须熟练掌握常的命令(复习+扩展学习Linux命令)
2、Linux下vim/vi 编辑器 命令总结
3、学习课件:
这个地址我直接把B站中评论下方分享的弄出来了,如果失效,可以下方评论,我把我下载的分享给你。
下载地址
二、跟着视频实践开始:
建议打开我之前的来个博客(如果对vim和linux不太熟悉),然后看着视频,开始学习跟着视频写出代码。如果只看一遍,我感觉我是记不住的,还能多熟练一下Linux知识。
第一天,加油!!!
1、打出hello world:
①、更改sh文件权限执行
linux的命令,我这里新建一个学习文件夹,跟着学习视频系统学习一波shell编程:
1 | mkdir shell_study |
2 | cd shell_study/ |
3 | vim first_shell.sh |
在first_shell.sh中敲入这些代码,(建议和我一样的之前不会shell的,自己敲一遍,不要做眼高手低的人。)
1 | #!/bin/bash |
2 | #Filename:first_shell.sh |
3 | #auto echo hello world! |
4 | #by authors zhaojiafu 2019 |
5 | |
6 | echo "Hello world!" |
echo 相当于python的print,就是一个打印的功能
然后,wq保存即可(vim的文本操作,小白不会的可以打开我的vim博客,需要什么搜索跟着实现)。
然后更改文件权限chmod:
这个我linux命令必须熟练掌握常的命令这个博客里面有常用的一些命令总结。不会的也可以常常学习看看。
1 | chmod 777 first_shell.sh |
2 | chmod o+x first_shell.sh |
然后:
1 | ./first_shell.sh |
打印出Hello world!:
第一个shell命令就完成了,是不是很简单。
②、不更改文件权限执行:
看到视频的命令,他用的问件是同一个,而且之前的权限改了,所以,我重新再写一个,测试试试:
1 | vim first_shell2.sh |
写入:
1 | #!/bin/bash |
2 | #Filename:first_shell.sh |
3 | #auto echo hell world! |
4 | #by authors zhaojiafu 2019 |
5 | |
6 | echo "Hello world22!" |
然后保存:
1 | /bin/bash ./first_shell2.sh |
为了再一次证实俩个文件权限不一样:
1 | ll |
可以看出俩个文件权限确实不一样,但是都可以实现,这样,对于视频的讲解也能更理解深刻了,这样虽说学习的速度是慢了一些,但对于第一次学习,效果觉得很好,坚持下去,学会了才是自己的,不然还是别人的。
2、shell编程之变量
①、变量的简单使用
变量的使用需要$ 而且赋值不需要空格,和python有区别。
1 | vim var.sh |
敲入代码(熟练vim的可以复制,其他建议自己和我一样,敲出来学习效果比较好,以后不再赘述):
1 | #!/bin/bash |
2 | #define path variables |
3 | #by authors zhaojiafu 2019 |
4 | |
5 | name=zhaojiafu |
6 | |
7 | echo "My name is $name" |
8 | |
9 | echo $UID |
10 | |
11 | echo $PWD |
然后直接使用不更改权限执行shell脚本:
②、几个shell的常见系统变量
1 | SHELL 常见的系统变量解析 : |
2 | $0 当前程序的名称 |
3 | $n 当前程序的第 n 个参数 ,n=1,2, , 9 |
4 | $* 当前程序的所有参数 ( 不包括程序本身 ) |
5 | $# 当前程序的参数个数 ( 不包括程序本身 ) |
6 | $? 命令或程序执行完后的状态,一般返回 0 表示执行成功。 |
7 | $UID 当前用户的 ID |
8 | $PWD 当前所在的目录 |
1、测试$0
和$n
:
1 | vim var.sh |
敲入代码:
1 | #!/bin/bash |
2 | #define path variables |
3 | #by authors zhaojiafu 2019 |
4 | |
5 | name=zhaojiafu |
6 | |
7 | echo "My name is $name" |
8 | |
9 | echo $UID |
10 | |
11 | echo $PWD |
12 | |
13 | |
14 | echo "***********************************" |
15 | |
16 | echo "$ 0 $0 " |
17 | |
18 | echo "$ 1 $1" |
19 | echo "$ 2 $2" |
20 | ~ |
我感觉这样更能表达出效果:
$0就是文件名称
$1和$2为空
1 | /bin/bash var.sh |
1 | /bin/bash var.sh hello word everyone |
这个就是shell会把空格分开的作为传入的参数。
2、测试$*、$#、$?
1 | vim var.sh |
敲入代码:
1 | #!/bin/bash |
2 | #define path variables |
3 | #by authors zhaojiafu 2019 |
4 | |
5 | name=zhaojiafu |
6 | |
7 | echo "My name is $name" |
8 | |
9 | echo $UID |
10 | |
11 | echo $PWD |
12 | |
13 | |
14 | echo "***********************************" |
15 | |
16 | echo "$ 0 $0 " |
17 | |
18 | echo "$ 1 $1" |
19 | echo "$ 2 $2" |
20 | |
21 | echo "***********************************" |
22 | |
23 | echo "This is \$* $*" |
24 | echo "This is \$\# $#" |
25 | echo "This is \$? $?" |
执行shell脚本:
1 | /bin/bash var.sh hello word everyone |
③、LAMP菜单导航编写:
1 | vim var2.sh |
敲入代码:
1 | #!/bin/bash |
2 | #by authors zhaojiafu 2019 |
3 | |
4 | echo -e "\033[31m Please select Menu follow:\033[1m" |
5 | |
6 | echo "1)安装apache服务器." |
7 | echo "2)安装Mysql服务器." |
8 | echo "3)安装PHP服务器." |
9 | echo "4)配置LAMP WEB架构." |
10 | |
11 | echo "---------------------------------------------" |
保存后执行:
发现视频中,直接sh 后面跟着shell脚本也是可以执行。现在知道三个方式可以执行shell脚本命令了。
3、if条件语句:
①、判断俩个数字大小
1 | vim if_test.sh |
敲入逻辑代码:
记得:
- if后面要跟
;
和then
- 最后面要跟上
fi
才算得上完整的if语句,不然报错。
1 |
|
2 | #auto if test |
3 | #by authors zhaojiafu 2019 |
4 | |
5 | NUM1=100 |
6 | num2=200 |
7 | |
8 | if (($NUM1 > $num2));then |
9 | echo "This is $NUM1 greate $num2" |
10 | else |
11 | echo "This is $NUM1 less $num2" |
12 | fi |
运行脚本:
1 | sh if_text.sh |
②、一些逻辑运算符(熟练记得)
逻辑运算符解析:
1 | -f 判断文件是否存在 eg: if [ -f filename ] |
2 | -d 判断目录是否存在 eg: if [ -d dir ] |
3 | -eq 等于 应用于:整型比较 |
4 | -ne 不等于 应用于:整型比较 |
5 | -lt 小于 应用于:整型比较 |
6 | -gt 大于 应用于:整型比较 |
7 | -le 小于或等于 应用于:整型比较 |
8 | -ge 大于或等于 应用于:整型比较 |
9 | -a 双方都成立( and) 逻辑表达式 –a 逻辑表达式 |
10 | -o 单方成立( or) 逻辑表达式 –o 逻辑表达式 |
11 | -z 空字符串 |
③、判断文件夹是否存在:
注意点
- 判断的中括号必须要都有空格,不然报错,我第一次
$path
和]
没有空格,就会报错。 [ ! -d $path ]- 使用颜色字体,记得echo后面跟着-e,我刚刚忘了,然后没颜色,还把
\033[32m
这些都打印出来了。后来加入-e 就好了。
vim创建文件,并进入敲入代码
1 | vim if_is_dir.sh |
敲入代码:
其中这个路径可以是相对路径(相对于当前shell执行脚本文件的位置),因为视频的教学中使用的是绝对路径,我这里直接使用相对路径测试。
1 |
|
2 | #auto is dir |
3 | #by zhaojiafu 2019 |
4 | |
5 | path=./shell_study/1 |
6 | |
7 | if [ ! -d $path ];then |
8 | mkdir -p $path |
9 | echo -e "\033[32m$path create success! \033[0m" |
10 | else |
11 | echo -e "\033[32m$path id exists,exit\033[0m" |
12 | fi |
输入执行shell脚本命令:
1 | /bin/bash if_is_dir.sh |
然后自动创建一个文件夹
创建了文件夹。
到这里,我想使用之前的一个常用系统变量$n传参进行一个自动化脚本,判断是否存在目录。
代码改为:
只是把之前的固定目录,换成了$1,用来传参。
1 |
|
2 | #auto is dir |
3 | #by zhaojiafu 2019 |
4 | |
5 | #path=./shell_study |
6 | path=$1 |
7 | |
8 | if [ ! -d $path ];then |
9 | mkdir -p $path |
10 | echo -e "\033[32m$path create success! \033[0m" |
11 | else |
12 | echo -e "\033[32m$path id exists,exit\033[0m" |
13 | fi |
然后执行命令试试:
1 | /bin/bash if_is_dir.sh 1/2 |
进入1目录,还有个2目录:
所以我们测试成功了。
如果再执行一次,就会提示已经存在目录。
④、判断文件是否存在:
1 | vim is_file.sh |
写入代码:
1 |
|
2 | #auto is file |
3 | #by authors zhaojiafu 2019 |
4 | |
5 | File=$1 |
6 | |
7 | if [ ! -f $File ];then |
8 | echo "ok" >> $File |
9 | else |
10 | echo -e "\033[32m-----------------------------------\033[1m" |
11 | cat $File |
12 | fi |
第一次执行:
第二次执行:
④、成绩分数分类:
创建shell脚本
1 | vim score.sh |
敲入逻辑代码:
1 |
|
2 | #auto score class |
3 | #by authors zhaojiafu 2019 |
4 | |
5 | score=$1 |
6 | |
7 | if [ -z $score ];then |
8 | echo "请输入分数" |
9 | exit |
10 | else |
11 | if [ $score -gt 90 ];then |
12 | echo "优秀" |
13 | elif [ $score -gt 80 ];then |
14 | echo "良好" |
15 | elif [ $score -gt 70 ];then |
16 | echo "中等" |
17 | elif [ $score -gt 60 ];then |
18 | echo "及格" |
19 | else |
20 | echo "不及格" |
21 | fi |
22 | fi |
测试:
结果输入110 竟然页数优秀,所以,需要加个限制:
这个不知道为什么,我把大于100或者小于0合并到一个判断里面,总是报错,分开就好了,如果有懂得欢迎给我讲讲哈。
1 |
|
2 | #auto score class |
3 | #by authors zhaojiafu 2019 |
4 | |
5 | score=$1 |
6 | |
7 | if [ -z $score ];then |
8 | echo "请输入分数" |
9 | exit |
10 | elif [[ $score -gt 100 ]];then |
11 | echo "输入的分数有误,分数在0-100之间" |
12 | |
13 | # elif [[ $score -gt 100 -o $score -lt 0 ]];then |
14 | elif [[ $score -lt 0 ]];then |
15 | echo "输入的分数有误,分数在0-100之间" |
16 | else |
17 | if [ $score -gt 90 ];then |
18 | echo "优秀" |
19 | elif [ $score -gt 80 ];then |
20 | echo "良好" |
21 | elif [ $score -gt 70 ];then |
22 | echo "中等" |
23 | elif [ $score -gt 60 ];then |
24 | echo "及格" |
25 | else |
26 | echo "不及格" |
27 | fi |
28 | fi |