脚本概念
- 将多个命令整合在一个文件
- 通过执行加载一个文件可以完成多件事
变量
-
创建变量,是临时的
X=1234
-
输出变量
echo $X
-
执行脚本
sh 脚本路径.sh
-
脚本demo
dir=oldgirl mkdir /$dir/oldboy01 mkdir /$dir/oldboy02 mkdir /$dir/oldboy03
-
永久变量的设置
vi /etc/profile 切换到行尾 添加x=1234 即使系统重启后echo $x 也会存在 后续修改后需要重新加载
-
重新加载文件
source /ect/profile
-
显示环境变量
echo $PATH 或 env
-
环境变量生效顺序
- /etc/profile:开机所有用户加载此文件
- .~/.bashrc
- .bash_profile
- .bashrc
- /etc/bashrc
条件表达式
-
文件测试
参数 解释 -e 存在则为真 -f 是否为文件 -d 是否为目录,是否存在 -x 是否可执行 -r 是否可读 -w 是否可写 -
用法
#/etc/hosts是否存在 [ -e /etc/hosts ] echo $? 0 0为上一条命令执行结果为正确,文件存在 [ -f /etc/hostsss ] && echo ok || echo error error 不为文件/不存在 [ -d /etc ] && echo ok || echo error ok /etc为目录 或者用 test -参数 文件
数值比较
语法格式:[ 数值1 比较符 数值2 ]
判断比较符号
符号 | 含义 |
---|---|
-gt | 大于 |
-lt | 小于 |
-eq | 等于 |
-ge | 大于等于 |
-le | 小于等于 |
-ne | 不等于 |
-n | 字符串长度不为0 |
-z | 字符串长度是否为0 |
-
[ [] ]建议使用 == != > < >= <= 比较符
-
用法
[ 10 -eq 10 ] && echo $? || echo $? == [ 10 -eq 10 ];echo $? 0 0 [root@pert ~]# [ 10 -eq 12 ] && echo $? || echo $? == [ 10 -eq 12 ];echo $? 1 == [ 10 -eq 12 ] 0
-
统计磁盘使用率,如果磁盘大于5%则发邮件报警,小于则提示ok
-
如何取出磁盘当前使用率
disk=`df -h | grep /$ | awk '{print ${NF-1}}'` #从后往前删除一个%,需要加撬棍转义 echo ${disk%\%}
-
用数值表达式判断大小 如果小于提示ok
-
测试脚本
#!/bin/bash disk=`df -h | grep /$|awk '{print $(NF-1)}'` [ ${disk%\%} -gt 5 ] && echo 磁盘使用已超过5%,当前使用率为$disk || echo ok
-
-
统计内存判断使用率
[ `free | awk 'NR==2{print $3/$2*100}' | awk -F. '{print $1}'` -gt 4 ] && echo mail || echo error
多整数比较
参数 | 含义 |
---|---|
-a | 并且 |
-o | 或者 |
[ 10 -eq 10 -a 10 -lt 9 ] && echo 成立 || echo 不成立
不成立
[ 10 -eq 10 -o 10 -lt 9 ] && echo 成立 || echo 不成立
成立
- 在双括号([[]])里用 && == -a、||==-o
字符串比较需要加双引号
[ "$USER"==root ] || echo 成立 || echo 不成立
成立
正则比较:需要使用[[ ]]
“=~” 用于判断string和右边的pattern是否匹配
[[ $USER =~ ^r ]]
echo $?
0
[[ !$USER =~ ^r ]]
echo $?
0
判断是否是整数
test=123qqq
[[ $test =~ ^[0-9]+$ ]]
echo $?
if
if [判断的条件] && [判断条件2]
then
符合执行的
else
不符合执行的
fi
$UID:显示当前登陆系统用户id数值
/usr/bin/id -gn:显示当前登陆系统用户的组名
/usr/bin/id -un:显示当前登陆系统用户的用户名
&&都需要满足
-
单个条件可以简写
[ 判断的条件 ] && 满足条件执行的命令
-
demo
#!/bin/sh SYSTEM=`uname -s` # 获取操作系统类型,我本地是linux # 如果是linux话输出linux字符串 if [ $SYSTEM = "Linux" ] ; then echo "Linux" elif [ $SYSTEM = "FreeBSD" ] ; then echo "FreeBSD" elif [ $SYSTEM = "Solaris" ] ; then echo "Solaris" else echo "What?" fi # 判断结束,以fi结尾
for
-
命令行中使用
for num in {01..10};do echo $num;done
-
脚本中使用
1.sh #!/bin/bash for old in {1..100} do cat 1.txt >> 2.txt done sh 1.sh
sleep:睡眠
1.sh
sleep 60
暂停60秒
脚本中符号要注意的
- 字符串需加双引号,不知道加什么就加双引号,解析变量
- 单引号所见即所得,不解析变量
- 反引号解析命令``
- $()也可以解析命令
- 命令的定义是把结果复制给了变量,如果想改变结果 再次赋值
Shell特殊位置变量
-
$0
[root@pert ~]# sh 1.sh 1.sh [root@pert ~]# sh /root/1.sh /root/1.sh [root@pert ~]# sh ./1.sh ./1.sh [root@pert ~]# basename /root/1.sh 1.sh [root@pert ~]# basename ./1.sh 1.sh [root@pert ~]# basename 1.sh 1.sh
-
$n:脚本的第n个参数
sh 1.sh oldboy oldgirl #1.sh echo $1 echo $2 oldboy oldgirl 执行脚本后面跟的就是参数
ps: 9 之后需要加括号,比如: 9之后需要加括号,比如: 9之后需要加括号,比如:(10)、$(11)
否则就是$1+0
-
$#:获取脚本传参的总个数,控制脚本的传参个数
#1.sh [ $# -ne 2 ] && echo "请输入两个参数" && exit name=$1 age=$2 echo $name $age sh 1.sh oldboy 18 oldboy 18 sh 1.sh old 清输入两个参数 exit 50 执行结束后打印$?结果的是50
-
$ ∗ :获取脚本所有的参数,不加引号和 *:获取脚本所有的参数,不加引号和 ∗:获取脚本所有的参数,不加引号和@相同,加上双引号,则把多个参数视为一个参数
#1.sh echo $* echo $@ sh 1.sh old girl boy old girl boy old girl boy
-
$ @ :获取脚本所有的参数,不加引号和 @:获取脚本所有的参数,不加引号和 @:获取脚本所有的参数,不加引号和*相同,加上双引号,则把多个参数都视为独立的参数
#1.sh echo "$*" echo "$@" sh 1.sh old girl boy old girl boy old girl boy
-
$?:获取上一条命令的返回结果 0:成功、非0:失败
echo 11 11 echo $? 0 ls ---- error echo $? 2
-
$$;获取脚本的pid
-
$!:获取上一个在后台运行的脚本pid
kill -9 $!
-
$_:获取上一条命令的最后一个参数,相当于esc+.
PS: ∗ 和 *和 ∗和@在脚本中相同,在循环体内不同
#模拟传参
set -- "I am sll boy"
#正常打印,不加双引号
echo $*
I am sll boy
echo $@
I am sll boy
#正常打印,加双引号
echo "$*
I am sll boy
echo "$@"
I am sll boy
#用for循环不加引号
for i in $*;do echo $i;done
I
am
sll
boy
for i in $@;do echo $i;done
I
am
sll
boy
#用for加双引号
for i in "$*";do echo $i;done
I am sll boy
for i in "$@";do echo $i;done
I
am
sll
boy
read:相当于python的input
#!/bin/bash
dir="/etc/hosts"
read -p "请输入一个文件名称:" dir1
echo $dir
echo $dir1
#多个参数
read -p "请输入两个数字" num1 num2
数值运算
- expr:整数运算
expr 1+1
1+1
expr 1 + 1
2
expr 1 \* 10
10
expr 1 / 10
0
expr 10 /2
5
判断是否为整数
expr 1 + 变量
[ $? -eq 0 ] && echo 为整数 || echo 不为整数
- $():整数运算,运算效率最高
echo $((10+10))
20
echo $((10/10))
1
echo $((10-10))
0
echo $((10*10))
100
- $[]:整数运算
echo $[10+10]
20
echo $[10*10]
100
- bc:整数运算、小数运算
echo 1+1|bc
2
echo 10*10.5|bc
105
- awk:整数、小数运算
awk 'BEGIN{print 1+1.5}'
2.5
echo 10 20 | awk '{print $1*$2}'
200
echo高级用法
-
从前往后删除
url=www.baidu.com echo $url www.baidu.com echo $url | sed "s#www.##g" baidu.com echo ${url#*.} baidu.com echo ${url#*.*.} com echo ${url##*.} com #:后面跟要删除的匹配字符 ##:贪婪匹配
-
从后往前删除
url=www.baidu.com echo $url www.baidu.com echo ${url%.*} www.baidu echo ${url%.*.*} www echo ${url%%.*} www %:后面跟要删除的匹配字符 %%:贪婪匹配
-
替换
echo $url www.baidu.com echo ${url/www/sss} sss.baidu.com 贪婪匹配 echo ${url//w/s} sss.baidu.com