一、什么是shell脚本
shell是一种命令解释器,用来解释一系列命令,而shell脚本就是很多个命令组合成的文件。
shell脚本的概念
1、将要执行的命令按顺序保存到一个文本文件
2、给该文件可执行权限
3、可结合各种shell控制语句以完成更复杂的操作
shell脚本应用场景
1、重复性操作
2、交互性任务
3、批量事务处理
4、服务运行状态监控
5、定时任务执行
等等
二、shell脚本基础命令
# 正文 单行注释
<<COMMENT
......
......
COMMENT 多行注释 COMMENT可更换
shell脚本几种运行方式
有权限的情况
1、给予脚本执行权限 (会开启新的bash,执行完退出)
chmod +x test.sh
./test.sh
然后直接相对路径或者绝对路径运行脚本
没有权限的情况
2、bash 、sh运行脚本(会开启新的bash,执行完退出)
bash test.sh
sh test.sh
3、source或"."运行脚本(不会开启新的bash)
source test.sh
. test.sh
bash -x test.sh 逐行调试检测脚本
bash -n test.sh 只能够检测语法上的错误 (直接确定某一行)
一键创建本地yum源
#!/bin/bash
mount /dev/sr0 /mnt
mkdir /etc/yum.repos.d/bak/
mv /etc/yum.repos.d/* /etc//yum.repos.d/bak/
echo "[centos7]
name=centos7
basrurl=file:///mnt
enabled=1
gpgcheck=0" >>/etc/yum.repos.d/yum.repo
yum repolist
shell脚本变量
自定义变量
变量名=变量值 变量名:字母、数字、下划线组成,不能以数字开头,区分大小写,不能是特殊符号(定义一个变量之后,切换一个新的bash 不可用)
echo $SHLVL 查看当前bash层级
引用变量用$
echo $a
unset 变量名 取消变量
set 查看系统所有自定义变量,与grep一起用方便
declare -i int=10 定义一个变量为整数型 浮点型 float double 字符串型 string
a=`date` ``也可引用变量
a=$(date) $()引用变量
rpm -ql $(rpm -qf $(which rz))
readonly a 定义变量a为只读 (不可删除、不可更改) 只能够退出这个shell
read a 交互式赋值给变量a
read -p "请输入你的名字:" name
read -n 5 name -n 只能输入5个字符 -s 隐藏输入
当定义一个a变量
不可使用$armb 他会把armb看出一个整体 ,系统中没有armb这个变量 所以要${a}rmb
变量值中间不可以加空格,若要加空格需要加转移字符 “\ ”
单引号里$变量名直接就输出$变量名 双引号里$变量名就输出变量值
创建用户的脚本
环境变量
查看系统中有多少环境变量
env 查看系统中的环境变量
echo $HOME 输出单个环境变量
echo $USER
echo $UID
自己添加环境变量
永久的
vim /etc/profile
在里面添加一条
例如 export aa=10
然后重新读取一下
source /etc/profile
临时的
export aa=10
直接为脚本做执行环境
永久的
vim /etc/profile
在# path里添加
PATH=$PATH:/root
临时的
export PATH=$PATH:/root
echo 输出颜色
可以改变数字调节颜色
重定向
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存得到指定的文件(覆盖原有内容) |
重定向输出 | >> | 将输出结果追加到指定的文件尾部 |
标准错误输出 | 2> | 将错误信息保存到指定文件(覆盖原有内容) |
标准错误输出 | 2>> | 将错误信息追加到指定文件中 |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
2>能够接受错误的信息 >只能接受正确的信息
要想两个都接受只能
输入黑洞
ls xxx file.sh &>/dev/null
位置变量
$0 代表脚本名本身
$1 是脚本后第一个参数
$2 是脚本后第二个参数
以此类推…
$# 表示命令行中位置参数的个数
$* 表示所有位置参数的内容,这些内容当作一个整体
$@ 表示列出所有位置参数 ,但是是以单个形式的列出
$? 表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回任何非0值均表示执行出现异常
$0 表示当前执行的脚本或程序的名称
$$ 表示返回当前进程的进程号
$! 返回最后一个后台进程的进程号
*$会把输出的内容当成一个整体,比如:touch KaTeX parse error: Undefined control sequence: \* at position 1: \̲*̲会创造一个整体文件名文件,而不…@会把输出的内容以单个形式输出,比如:touch $@会创造多个文件
运算
expr
expr 1 + 1
expr 1+1
expr 2 \* 3 expr乘以需要反斜杠
expr 2 / 3 只显示整数部分
expr 4 % 3 取余数
也可引用变量
注意事项:注意空格 格式
$[ ]、$(( ))
echo $[1+2]
echo $[2*3]
echo $[2/2]
echo $[2%2]
echo $[2**8] 算2 的8次方
echo "2^8" | bc 算2的8次方
引用变量
echo $[$a+$b]
echo $[a+b]
echo $[a-b]
echo $[a*b]
echo $[a/b]
echo $[a%b]
echo $((1+2))
echo $((2*3))
echo $((4-7)) 可以显示负整数
echo $((a+b))
echo $((a*b))
echo $((a%b))
let
需要echo输出答案
let a++
let a--
let ++a
let a=2**8 赋予a 2的8次方
++a 先加后执行
a++ 先执行后加
bc
bc
1.1+2.1 可以显示小数
quit 退出bc
echo "1.1+2.1" | bc
3.2
echo "scale=3;10/3" | bc scale规定输出几位(只能运用于乘除 ,不可应用于加减)
echo $[3**2] 算2的二次方
echo $[3**3] 算2的三次方
echo $[3**8] 算2的8次方
echo "2^8" | bc 算2的8次方
bc 不支持**,支持^
根据输入的半径求圆的面积
**注意事项""只能在前面算式中,不可越过管道符