shell前情介绍
1. shell介绍
shell是一个程序,采用C语言编写,是用户和linux内核沟通的桥梁。它既是一种命令语言,又是一种解释性的编程语言。通过一个图表来查看一下shell的作用。
kernel(内核):管理硬件并驱动硬件完成工作
user:用户接口,用户下指令给内核
shell:命令解释器,把用户输入的命令解析成二进制交给内核
什么是shell脚本?
shell脚本就是将完成一个任务的所有的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。
一个最简单的例子:安装nginx的shell脚本
修改shell脚本的权限为可执行权限(chmod 700即可)
检查是否安装好nginx时需要把防火墙关闭:
查看 SElinux(一套增强Linux系统安 全的强制访问控制体系)状态:getenforce
临时关闭 SElinux:setenforce 0
永久关闭 SElinux:vim /etc/selinux/config 将SELINUX=enforcing改为SELINUX=disabled,保存退出
关闭防火墙:systemctl stop firewalld
永久关闭防火墙:systemctl disable firewalld
2. 学习shell语法前必知必会
2.1 shell脚本的语法规范
一个合格的shell脚本应该按照以下格式书写:
1):顶行标注解释环境 #!/bin/bash 或 #!/usr/bin/env bash
2):该脚本信息,Author、Created time、Script Description(不能出现中文)
3): 执行代码
#!/bin/bash
#Author: Bai Shuming
#Created Time: 2018/08/2712:27
#Script Description: first shell study script
#放要执行的代码...
shell脚本开头必须指定脚本运行环境 以 #!这个特殊符号组合来组成。如: #!/bin/bash 指定该脚本是运行解析由/bin/bash来完成的
2.1 如何运行一个脚本
在子shell中运行,不影响当前shell
1):给脚本文件赋予执行权限,chmod u+x filename,然后直接执行 ./opt/filename
2):用bash命令来执行未被赋权的脚本,bash filename 或 sh filename
在当前用户下运行另一个用户的脚本?
su ossuser -c bash './opt/filename'
在当前shell中运行,当前shell受影响
在执行时候用source命令执行:source filename
2.2 shell中的特殊符号
不要和正则表达式中的符号含义搞混淆了。
~: 家目录 # cd ~ 代表进入用户家目录
!: 执行历史命令 !! 执行上一条命令
$: 变量中取内容符
+ - * \ %: 对应数学运算 加 减 乘 除 取余数
&: 后台执行
*: 星号是shell中的通配符 匹配所有
?: 问号是shell中的通配符 匹配除回车以外的一个字符
;: 分号可以在shell中一行执行多个命令,命令之间用分号分割
|: 管道符 上一个命令的输出作为下一个命令的输入 cat filename | grep "abc"
\: 转义字符
``: 反引号 命令中执行命令 echo "today is `date +%F`"
' ': 单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不解释变量
" ": 双引号,脚本中出现的字符串可以用双引号引起来
2.3 shell的数学运算
方法一: expr
expr 命令只能做整数运算,格式比较固定
[root@haha ~]# expr 5 + 5
10
[root@haha ~]# expr 5 - 2
3
[root@haha ~]# expr 5- 2 #注意格式错误
expr: 语法错误
[root@haha ~]# expr 5 \* 2 #注意要将*进行转义,否则认为是通配符
10
[root@haha ~]# expr 10 / 2
5
[root@haha ~]# expr 3 % 2
1
使用bc计算器处理浮点运算,scale=2表示小数点保留两位
[root@haha ~]# echo "scale=2;10/3"|bc
3.33
[root@haha ~]# echo "当前内存使用率为:`echo "scale=2;282*100/2018"|bc`%"
当前内存使用率为:13.97%
方法二: $(())
echo $((numb1+numb2))
在shell中,也可以使用$(()) 也可以作运算
[root@haha ~]# echo $((2 + 3))
5
[root@haha ~]# echo $((2 ** 3))
8
[root@haha ~]# echo $(((100+3)%2))
1
方法三: $[]
[root@haha shell_0502]# echo $[2+5]
7
[root@haha shell_0502]# echo $[2*5]
10
[root@haha shell_0502]# echo $[(1+3)*2]
8
方法四: let 运算
[root@haha shell_0503]# let sum=2+3;echo $sum
5
[root@haha shell_0503]# let sum++; echo $sum
6
实现一个计算内存使用率的脚本
基础版
注意: awk 后面跟单引号, 不能跟双引号;$3 表示第3列,$(NF)表示最后一列,$(NF-1)表示倒数第二个
#!/bin/bash
# 内存的使用率
mem_used=`free -m | grep Mem | awk '{print $3}'`
mem_total=`free -m | grep Mem | awk '{print $2}'`
mem_use_ratio=$((mem_used * 100 / mem_total))
echo "当前内存使用率的百分比: $mem_use_ratio"
加强版
#!/bin/bash
#内存超过80%就用日志记录一下
mem_use=`free -m | grep "Mem" | awk '{print $3}'`
mem_total=`free -m | grep "Mem" | awk '{print $2}'`
mem_use_percent=$((mem_use*100 / mem_total))
file_name="mem_warn.log"
if [ ! -e $file_name ]
then
touch $file_name
fi
if (( mem_use_percent >= 80 ))
then
echo "警告:请注意内存使用!"
echo "`date +"%F %H:%M:%S"`的内存使用率为${mem_use_percent}%" >> $file_name
fi
2.4 退出脚本
在每条命令执行完之后,系统都会返回一个 exit num 表示该条命令的执行结果,一般0表示执行成功, 非0表示执行失败。可用 echo $? 查看上条命令的执行结果。
exit NUM 退出脚本, 释放系统资源, NUM为一个整数,代表返回值(在0-255之间,可以自定义)。
2.5 shell输出(echo格式化输出)
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。
echo "要显示的字符"
注意:(单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符,包括 $、`、\ 等特殊符号)
语法:echo [-ne][字符串]
命令选项:
-n:不要在最后自动换行
-e:若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
转义字符
\a发出警告声;
\b删除前一个字符(手写一个倒计时脚本可以用到);
\t插入tab;
\c最后不加上换行符号;
\n换行且光标移至行首;
\r光标移至行首,但不换行;
\v与\f相同; \插入\字符;
\nnn插入nnn(八进制)所代表的ASCII字符;
[root@haha snd]# echo -e "\a\a\a\a\a\a" # 发出警告声
[root@haha snd]# echo -e "he\bllo" # 删除 \b 前面的字符e
hllo
[root@haha snd]# echo -e "hello\tworld" # helloworld中间加一个tab
hello world
练习一个倒计时脚本:
#!/bin/bash
for time in `seq 9 -1 0`; do
echo -n -e "\b$time"
sleep 1
done
echo
echo显示内容带颜色,需要使用 -e 参数,格式如:echo -e "\033[文字背景颜色;文字颜色m 字符串\033[0m",例如 echo -e "\033[41;36m something here \033[0m"
下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配
例
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[34m 黄色字 \033[0m”
echo -e “\033[41;33m 红底黄字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
字颜色:30—–37
echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
字背景颜色范围:40—–47
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”
最后面控制选项说明
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m — \33[37m
设置前景色
\033[40m — \33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\33[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
2.6 shell输入(read交互输入)
当脚本程序执行到read命令时,程序由 running 状态变为 sleep 状态, 等待用户从键盘输入, 直到用户敲下 Enter 键,程序才继续往下走。
语法:read [-stnp]
read 命令选项:
-s:不显示
-t:限定时间
-n:限定输入字符个数
-p:打印信息
[root@haha shell_0407]# read
xiaoming
[root@haha shell_0407]# read -n2 # 2s不输入自动退出
[root@haha shell_0407]# read -s # 不显示输入内容
[root@haha shell_0407]# read -s passwd; echo $passwd # 将用户输入的内容赋值给变量passwd, 并echo查询
123123
[root@haha shell_0407]# read -n6 user # 显示user为6位
xiaomi[root@haha shell_0407]#
[root@haha shell_0407]# read -p "Login: " user # 显示信息,并将用户输入的信息赋值给变量user
Login: xiaoming
[root@haha shell_0407]# echo "Login: $user"
Login: xiaoming
练习不校验用户名和密码的登录脚本
#!/bin/bash
clear
echo "Centos Liinux 7 (Core)"
echo -e "Kernel `uname -r` an `uname -m`\n"
read -p "$HOSTNAME login: " account
read -s -p "password: " password
echo