shell编程语言-1 shell脚本基础
1、shell脚本基础
1.1 shell的作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。 常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符 等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
如何查看本机shell信息 cat /etc/shells
1.2 脚本执行逻辑
逻辑: 1.顺序 2.选择 3.循环
1.3 脚本错误调试
1.命令错误
2.语法错误
3.逻辑错误
4.查看代码是否正确
bash -n 脚本名称 – 检查语法错误
bash -x 脚本名称 – 逻辑错误 – 将脚本所有的语句执行一遍
bash $0执行上一条脚本
5.set -e
在脚本前输入set -e 一旦出错立即停止
2、重定向和管道符
2.1重定向
含义:把文件重新输出到你指定的位置。
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定文件读取数据而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
追加 | >> | 将输出结果追加到指定文件的尾部 |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原文件内容) |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
追加标准错误输出 | 2>> | 标准错误输出结果追加到指定文件尾部 |
2.2 管道符 |
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
3、变量
3.1.1弱引用和强引用
“ ” 表示弱引用,可以调用变量的值
‘ ’ 表示强引用,表示调用单引号内容本身
3.1.2 read -p
其含义是从键盘输入的内容变成变量
Read -p read -p”你想说的话” 变量名
3.1.3 export 定义全局变量
如果没有export 那么开启一个新的bash 将不会继承定义的变量
4、条件语句
4.1 操作符
如果要测试是否成功使用 $? 返回值
成功状态码:大多数命令在执行成功时会返回 0
。
失败状态码:执行失败时返回非 0
的数值(通常为 1-255 之间的整数,具体含义由命令定义)。
-d : 测试是否为目录
-e : 测试目录或文件是否存在
-f : 测试是否为文件
-r : 测试当前用户是否有权限读取
-w : 测试当前用户是否有权限写入
-x : 测试当前用户是否有权限执行
-L : 测试文件是否为软连接文件
-N FILE :文件自从上一次被读取之后是否被修改过
-O FILE :当前有效用户是否为文件属主
-G FILE :当前有效用户是否为文件属组
4.2 比较整数的数值
expr计算参数值
-eq : 等于
-ne : 不等于
-gt : 第一个数大于第二个数
-lt : 第一个数小于第二个数
-le : 第一个数小于或等于第二个数
-ge : 第一个数大于或等于第二个数
4.3 字符串的比较
= : 字符串内容相同
!= : 字符串内容不同,!表示相反的意思
-z : 字符串内容为空
-n : 字符是否存在
4.4 逻辑测试 与 和 或
与
第一个要为真 第二个也要为真
一个为假就为假
cmd1 && cmd2
或
一真即为真
第一个为真 那么 不用执行第二个
第一个为假 才需要执行第二个
cmd1 || cmd2
cmd1 || cmd2 && cmd3
如果cmd1为假 就执行cmd2判断是否为真,如果cmd2为假,那么就不会执行cmd3了,整个式子为假。
如果cmd1为真,就不会执行cmd2了。执行cmd3。
判断磁盘使用情况是否正常|| echo 正常 && echo 不正常
4.5 if语句的结构
分支结构
单分支
if 判断条件;
then 条件为真的分支代码
fi
双分支
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支
if 判断条件
then;执行语句1
elif;
then;执行语句2
elif;
then ;执行语句3
fi
条件2为真的分支代码
elif 判断条件3;then
条件3为真的分支代码
...
else
以上条件都为假的分支代码 托底
例子:
2.case
case $i in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
例子:
5.循环
for 一直循环次数
while 未知循环次数
until 未知循环次数(几乎没人用)
5.1 for循环
for 名称(变量名)循环列表(循环次数)
do
命令序列
done
for 变量名 in 取值列表
do
命令序列
done
for 变量名 in
5.2 while 循环
条件为真执行
条件为假跳出循环
while 判断条件
do
命令序列
done
6.函数和数组
函数 :
简化脚本
脚本代码可变性较高
os 判断系统类别的脚本
1.定义函数
2.调用函数
定义函数
1.
function 函数名{
函数体
}
2.
函数名(){
函数体
}
3.
function (){
函数体
}
上传 :scp 要传输的文件 IP地址:接收文件的文件夹(绝对路径)
定义数组
数组名=(数组值1 数组值2.................)
数组名[下标]=数组值
-
查看数组中所有元素
-
echo ${数组名[@]}
-
echo ${数组名[*]}
-
查看数组中的具体元素
-
echo ${数组名[下标]}
-
显示数组中所有下标
-
echo ${! 数组名[@]}
-
echo ${! 数组名[*]}
-
查看数组中元素的总个数
-
echo ${#数组名[*]}
7.echo
在操作系统的命令行界面中,echo
是用于输出文本或变量值的基础命令。
下面是一些基本的例子:
主机名
hostname
IP地址
ifconfig ens33|grep inet | tr -s " " |cut -d " " -f3 |head -n 1
内存容量
free -h | grep Mem|tr -s " "| cut -d " " -f2
磁盘容量
lsblk | grep "sd"| head -n1| tr -s " "|cut -d " " -f4
cpu
lscpu| grep "型号名称"| tr -s " "
内核版本
uname -r
系统版本
cat /etc/redhat-release
#!/bin/bash
echo "hostname : `hostname`"
echo "ip地址:`ifconfig ens33 | grep netmask| tr -s " "| cut -d " " -f3 `"
echo "内存容量:` free -h |grep Mem|tr -s " "| cut -d " " -f2 ` "
echo "磁盘容量:`lsblk | grep "sd"| head -n1| tr -s " "|cut -d " " -f4 `"
echo "cpu`lscpu| grep "型号名称"| tr -s " "`"
echo "内核版本:`uname -r`"
echo "系统版本:`cat /etc/redhat-release`"
8.export
export 可以让子shell共享变量
/etc/profile
设置环境变量或系统默认环境配置的配置文件
~/bshrc | 只对当前用户生效 |
---|---|
~/.bash_profile | 只对当前用户生效 |
/etc/profile | 对所有用户生效 |
/etc/profile.d/*.sh | 对所有用户生效 |
9.预定义(状态)变量
bash 帮你定义好了 拿来用就可以了
$* | 表示所有位置参数的内容看成一个整体返回 返回所有 (加引号 “$*”) |
---|---|
$@ | 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有 (加引号 "$@") |
$? | 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常 |
$# | 表示命令行中位置参数的总个数 |
$0 | 表示当前执行的脚本或程序的名称 当前脚本的名字 |
$$ | 当前bash的进程id |
$! | 后台任务最后一个id |