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