说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家!
目录
一丶shell介绍
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序
基本上shell分两大类:
1.图形界面shell(Graphical User Interface shell 即 GUI shell)
例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。
2.命令行式shell(Command Line Interface shell ,即CLI shell)
例如:
bash / sh / ksh / csh(Unix/linux 系统)
(MS-DOS系统)
cmd.exe/ 命令提示字符(Windows NT 系统)
Windows PowerShell(支持 .NET Framework 技术的 Windows NT 系统)
传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。
文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。
shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。
Shell基本上是一个命令解释器,类似于DOS下的command。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。
交互式shell和非交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了
shell是一段应用程序,是用户和操作系统交互的一个桥梁,shell通常就是shell脚本
shell弱类型语言,在定义变量不需要指定变量的类型
二丶shell脚本规范
1.shell脚本是以.sh结尾的文件
2..sh文件的第一行内容为#!/bin/bash—->表示使用shell进行编程
3.shell中的注释:#
三丶shell语法
1.变量的使用
1.变量名=变量值
- 等于号两边没有空格
- 输出变量
2.变量命名规范
- 不能以数字开头,由字母、数字、下划线组成
3.变量的释放
- unset 变量名
4.特殊的变量,带有空格的变量定义
- 变量值用双引号””括起来
- 变量值用单引号”括起来
- 双引号和单引号的区别
- 双引号:如果变量值中存在$变量名的话,那么输出结果将会是变量名对应的变量值
- 单引号:如果变量值中存在$变量名,那么将原样输出
- 双引号:如果想原样输出内容,可以在$变量名前面加转义字符\
- 反单引号“,存放的是命令
5.练习
练习1:使用shell脚本,输出当前所在的目录
- 首先博主先在桌面上创建一个data的文件夹,在文件夹中再创建2个文件夹分别是1和2,把本博客所有shell脚本文件全部在1这个目录下进行编写
- 使用vi命令创建script_01.sh文件,在文件中进行如下编写(不会vim的就只能自己去补充一下命令了,博主都会)
- 执行script_01.sh脚本时,提示权限不足,那么要么更改文件权限要么切换到root用户再执行,如果两个都不想的话,就可以通过sh命令来执行
- 修改脚本权限增加x执行权限
练习2:计算/etc目录下有多少个文件,用shell脚本实现
- shell脚本命令中有一个wc -l的命令是获取文件的数目,所以编写脚本时需要使用管道|将ls -l查询到的文件通过wc -l命令进行统计
- 执行脚本,成功输出etc下的文件数目
练习3:实现统计任何指定目录下的文件个数
- 需要执行目录而实现统计该该目录下的文件个数,那么则需要使用read命令(等待输入,有点类似python中的input),如下所示输入read a回车后,则出现以下等待输入
- read除了可以执行输入一个变量还可以指定多个变量,变量之间用空格隔开
- 同样的释放变量时,unset也可以指定一次性释放多个变量
- 当使用read命令输入变量值时,变量值多于变量名,那么就会将多出的变量值一起赋给最后一个变量
- 复制script_02.sh脚本,命名为script_03.sh,进行如下修改,需要注意的是表示变量时需要在前面加$
- 运行脚本,输入目录统计文件数量成功
- 通过上面的read命令获取用户输入,但是并不友好,因为没有提示用户输入什么,所以可以添加提示信息:read -p “提示的内容” 变量名
- 再次执行脚本,就显得很友好,用户体验不错
2.参数传递
1.向.sh文件中传递数据
- 复制一份script_03.sh命令为script_04.sh,要实现sh script_04.sh /etc将要统计的目录以这种方式进行传递(命令 文件名 参数)
- 执行sh script_04.sh /etc命令传递要统计的目录/etc,成功统计数目
2.格式
文件中接收参数的方式
$1:表示第一个参数
$2:表示第二个参数
$3:第三个参数
$n:表示第n个参数
$0:代表文件名
$@:显示全部参数
$#:显示参数的个数
示例1:
- 使用$1来接收传递的第一个参数
- 运行脚本,打印出传递的第一个参数
示例2:
- 使用$2来接收传递的第二个参数
- 当传递一个参数时,那么这个参数会给$1,传递两个参数时,则第二个参数会给$2
- 根据以上两种示例可以得出$几表示接收第几个传递的参数,现在在脚本中使用$4则表示的只接收第四个参数
- 运行脚本,根据传递的第几个参数,对应$几
示例3:
- 使用$0来打印出文件名
- 运行脚本成功打印出当前脚本文件的名字
示例4:
- 使用$@显示命令传递的全部参数
- 运行脚本,显示出所有的传递的参数
示例5:
- 使用$#显示传递参数的个数
- 运行脚本,成功显示出传递参数的个数
3.重定向
把命令的内容输出到文件中
1.正确的命令(数字1表示)
- 覆盖(将当前目录下的查询到的文件重定向到a.txt中)
- 查询tmp目录下的文件并重定向到a.txt中,结果发现之前a.txt文件中内容被覆盖了
- 追加(对重定向文件中的内容进行保留,也就是在存在内容的情况下进行内容的追加,使用>>)
2.错误的命令(数字2表示)
- 覆盖(如在输入命令时,输入错误的命令那么就需要使用2来重定向到文件中)
- 追加
4.程序结构
1.分支结构
if…elif…else分支
a)格式
if [ 条件 ]
then
语句
else
语句
fi
if [ 条件 ];then
语句
else
语句
fi
b)注意
1.条件两边要有空格
2.多个条件间要有空格
3.if后面要有空格
4.条件中如果存在变量,那么变量的两边要有双引号,如:name=”cdtaogang”—->echo $name, N=”cdtaogang”
示例1:
- 判断 /root目录是否为空(字符串的比较:==判断是否相等,!=判断是否不相等)
- 执行脚本后,输出结果
- 将then和if判断语句写在一行也是可以的,但是必须加;
- 运行脚本成功
示例2:
- 通过用户输入任意目录判断是否为空
- 运行脚本,输入目标目录,成输出结果
示例3:逻辑运算符
- 判断用户输入的用户名和密码是否为admin 123456,如果是则提示登录成功,否则提示失败(且:-a,或者: -o,非: !)
- 运行脚本进行测试
示例4:数字间比较—>比较运算符
知识点:-eq:判断是否相等,-ne:判断是否不相等,-gt:判断是否大于,-ge:判断是否大于等于,-lt:判断是否小于,-le:判断是否小于等于
数字变量操作:((i++)) ((i+=1)) i=$[$i+1] let i=i+1 i=$(($i+1))
- 输入数字,判断是否大于0,如果大于0则将该数字-1并输出,否则+1输出
- 运行脚本进行测试
示例5:
知识点:测试文件的状态test 参数 变量名
参数:-e表示文件是否存在,-f表示文件是否存在且为文件,-d表示文件名是否存在且为目录,-r 可读,-w 可写,-x 可执行
- 判断用户输入的目录是否存在,如果存在则统计目录下的文件个数,否则提示用户该目录不存在
- 运行脚本进行测试
if…elif…else分支
a)格式
if [ 条件 ]
then
语句
elif [ 条件 ]
then
语句
elif [ 条件 ]
then
语句
….
else
语句
fi
示例1:
- 判断学生的成绩,范围在90-100提示优秀,80-90之间提示良好,70-80之间则提示一般,60-70之间提示及格。其他则提示不及格
- 运行脚本进行测试
示例2:文件判断
涉及知识点:-r filename 文件是否存在且可读,-w filename 文件是否存在且可写, -x filename文件是否存在且可执行,-f filename 文件是否存在且是普通文件,-d filename 文件是否存在且是一个目录,-e filename 文件是否存在,-n str1 字符串长度是否不等于0,-z str2 字符串长度是否等于0
- 判断用户输入的内容是否为空,为空则提示,不为空则判断是否为目录,不为目录则判断是否为文件,否则提示错误信息
- 运行脚本进行测试
case分支
a)格式
case $变量名 in
“值”)
语句;;
“值”)
语句;;
“值”)
语句;;
…..
*)
语句;;
esac
b)注意
1.case这一行最后必须为in
2. ;;—->结束语句
3.*—->默认
4.esac—>case语句的结束
5.值可以是字符串也可以是数字
6.“值”还可以是区间范围,范围[0-9]
示例1:
- 输入一个字母,判断该用户选择哪款产品,A:笔记本 B:电饭煲 C:小台灯
- 运行脚本进行测试
示例2:
- 请输入对客服的满意度,【0-3】不满意,【4-6】满意,【7-9】非常满意
- 运行脚本进行测试
2.循环结构
a)for循环
b)格式
for 变量名 in 列表
do
语句
done
示例1:
- 输出1-10之间的数
- 运行脚本进行测试
示例2:改进版
- seq start size max(start:开始点,size:间隔,max:结束点,注意:如果size的值为1,则可以省略)
- 运行脚本进行测试
示例3:
- 输出1到10之间的奇数,只需要将步长间隔改为2即可
- 运行脚本进行测试
评论前必须登录!
注册