1.Shell脚本的概念
2.Shell脚本的应用场景
3.Shell的作用 — 命令解释器,充当“翻译官”
介于系统内核与用户之间,负责解释命令行,Shell (壳程序)是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
4.Linux中有哪些Shell
最常用的就是bash、tcsh、 csh、sh、 nologin这些shell。这些shell都是依据Linux发展者的不同所创造出的不同版本。
注: bash ( /bin/bash) 是目前大多数Linux版本采用的默认Shell。
5.补充内容
1.编写脚本代码
vim /root/first.sh #使用vim编辑器
#!/bin/bash #脚本解释器声明
# this is my first shell-script #注释
echo 当前目录位于: #linux命令
pwd #linux命令
2.shell脚本的构成
3.shell脚本的执行
1)方法一:指定路径的命令,要求文件必须有 x(可执行)权限。
chmod +x /root/first.sh #给脚本添加可执行权限
指定绝对路径: /root/first.sh
指定相对路径: ./first.sh
2)方法二:指定shell来解释脚本,不要求文件必须有 x (可执行)权限。
sh 脚本路径: sh first.sh
source 脚本路径:. first.sh 或者 source first.sh(会切换到)
实例:sh 脚本路径执行shell脚本
实例:source 脚本路径执行shell脚本
4.shell脚本显示消息
大多数shell命令都会产生自己的输出,这些输出会显示在脚本所运行的控制台显示器上,很多时候,我们需要添加自己的文本消息来告诉执行脚本的用户当前脚本正在做什么。可以通过echo命令来实现这一点,如果在echo命令后面加上一个字符串,该命令就能显示出这个文本字符串。
默认情况下,不需要使用引号就可以将要显示的文本字符串显示出来,但是有时在字符串中出现引号的话就会出现问题了。echo命令可用单引号或者双引号来划定文本字符串,如果在字符串中用到了他们,我们需要在文本中使用其中一种引号,而用另一种来将字符串划定起来。
如果想要把文本字符串和命令输出显示在同一行中,可以使用echo语句的 -n
参数。
1.由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道。
将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同- -行命令中可以使用多个管道。
ps aux | wc -l #查看进程数
echo "abc123" | passwd --stdin zhangsan #给zhangsan用户设置密码abc123
交互式硬件设备 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
重定向的操作
实例:将123456重定向输出到pass.txt文件中,然后将pass.txt的内容重定向输入给用户张三的密码
注意:从pass.txt 文件中取密码,需要注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux(setenforce 0)。
实例:实验混合输出
本来1—>屏幕 ( 1指向屏幕)
执行>log后,1–>1og.txt (1指向log. txt)
执行2>&1后,2–>1 (2指向1,而1指向log. txt,因此2也指向了log. txt)
实例:输入重定向,显示passwd中的行数,单词数和字节数。
1.定义新的变量:
变量名以字母或者下划线开头,区分大小写,建议全大写,长度不超过20个。
变量名=变量值
2.查看变量的值:
echo $变量名
3.赋值时使用引号
testing=`date` , 也可以是testing$(date) ,代表的意思相同
实例:使用反撇号赋给变量,然后使用$使用该变量
实例:通过命令替换获得当前日期并使用它来创建唯一的文件名。
方法一:
read -p “提示信息” 变量名
方法二:
#!/bin/bash
echo -n "提示信息:"
read 变量名
实例:方法一获取用户输入的信息
实例:方法二获取用户输入的信息
默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时局部变量将无法再使用。
可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用。
格式1: export变量名
格式2: export 变量名=变量值
实例:测试局部变量和全局变量
可以使用pstree 命令查看Shell环境,输入bash命令进入子Shell环境
按Ctrl+D组合键或输入exit命令退出子Shell环境
pxpr 变量1 运算符 变量2 [运算符 变量3]
+ 加法、-减法、\*乘法、/除法、%取余
1.环境变量由系统提前创建,用来设置用户的工作环境,使用env命令
可以查看到当前工作环境下的环境变量:
2.设置系统根据环境变量自动设置可执行程序。
echo $PATH #查看当前搜索路径
PATH="$PATH:/root" #将/root目录添加到搜索路径
export PATH="$PATH:/root" #输出为全局环境变量
设置永久有效:
echo 'export PATH=$PATH:/root' >> /etc/profile #将全局环境变量追加到/etc/profile中
实例:将test脚本的所在目录加入搜索路径,然后测试直接执行脚本
readonly
命令用于定义只读shell变量和shell函数。readonly
命令的选项-p
可以输出显示系统中所有定义的只读变量。
实例:测试$10不加大括号和加大括号的区别
加上大括号之后如下:
实例:使用位置变量进行编写shell脚本的加法运算
1.$* 和 $@:都会表示命令或脚本要处理的参数。
预定义变量 | 表示的意思 |
---|---|
$0 | 表示当前执行的脚本或命令的名称 |
$# | 表示命令或者脚本要处理的参数的个数 |
$? | 表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常,也常被用于shell脚本中return退出函数并返回的退储值 |
实例:$* 和 $#的使用和区别
$* 和 $#的使用:
$* 和 $#的区别:上面例子还是看不出来有什么区别的,我们需要借助for循环来查看具体的区别。
案例:编写脚本,压缩文件的时候自动显示填写压缩文件名(包含当天日期),而且自定义压缩后显示的信息。
bash不支持浮点数运算(小数运算),如果需要进行浮点数运算,则需要bc、awk的帮助。
bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该表达式,最后返回结果。bash计算器能够识别:
1.第一种用法:直接使用bc,然后像使用计算器一样使用(-q选项可以不显示bash计算机的欢迎信息)
浮点允许是由内建变量scale控制的,必须将这个值设置为你希望在计算结果中保留的小数位数,否则无法得到想要的结果,如下例子:
scale变量的默认值是0,在scale值被设置前,bash计算器的计算结果不包括小数位,在设置为4后,显示的结果包含四位小数。
除了数字外,bash计算器还能支持变量
1.第二种用法:在脚本中使用
如下列案例:用命令替换运行bc计算器,然后设置scale=4,然后将结果赋予给变量var1,然后输出结果。