初步学完shell脚本编程,通过这篇博客对其小结一下
shell定义:shell其实是一个命令解释器,它的作用是解释用户输入的命令和程序
shell脚本:我们可以在文本中输入一系列的命令、控制语句和变量,这一切有机的结合起来就形成了功能强大的shell脚本。
一.基础语法
1.查看系统脚本解释器
常用的是bash解释器
2.使用bash解释器执行脚本的三种方式:
bash xx.sh
sh xx.sh
./xx.sh(注意是否有权限,没有通过chmod 755 xx.sh 或chmod u+x xx.sh 添加权限)
3.shell中的变量
系统变量
$HOME 家目录
$PWD 当前目录
$SHELL 解释器路径
$USER 用户
自定义变量
变量名=变量值注意等号两边没有空格
撤销变量 unset 变量名
静态变量
readonly 变量名=变量值(declare -r 变量名=变量值)
静态变量不能撤销,关机或运行完脚本自动失效
全局变量
变量名=变量值
export 变量名
特殊变量$
$n
n为数字,$0代表该脚本名称,$1-$9代表第一到第九个命令行参数,第十个及以后的参数需要用大括号包含,如${10}
$#
获取所有输入参数的个数
$@ 和$*
$@和$*都表示命令行中所有的参数,一般看来没有区别,for循环打印时都是一个个打印,但当用双引号分别将他们括起来,"$@"是分裂的,不是一个整体(for i in "$@"),而“$*”是一个整体
$?
最后一次执行命令的返回状态,如果值为0,证明命令执行正确,非0命令执行不正确
注意:函数中,函数的返回值只能有$?获取,且返回值小于等于255。单独比较大小时,结果也是由$?获取
4.运算符
乘除加减
第一种方式:$((运算式))和$[运算式],运算符之间有没有空格无所谓
第二种方式:`expr 变量1 +-*/% 变量2` 运算符之间有空格 ,要加反引号
条件判断
[ condition ] 条件与两端括号之间有空格
大小判断
-lt 小于
-le 小于等于
-ge 大于等于
-gt 大于
-eq 等于
-ne 不等于
文件类型判断
-f 文件存在且是一个常规文件
-e 文件存在
-d 文件存在是一个目录
文件权限
-r 有读的权限
-w 有写的权限
-x 有执行的权限
多条件判断
&& 与
|| 或
!逻辑否
5.流程控制
if语句
if [ 条件判断式 ];then
fi
if [ 条件判断式 ]
then
fi
if [ 条件判断式 ]
then
else
fi
if [ 条件判断式 ]
then
elif [ 条件判断式 ]
then
fi
case语句
case $变量名 in
“值1”)
程序
;;
“值2”)
程序
;;
*)
都不是
;;
esac
for 循环
for ((初始值;条件;;变量变化))
do
程序
done
for 变量 in 值1 值2 值3
do
程序
done
while 循环
while [ 条件判断式 ]
do
程序
done
读取控制台输入
read(选项)(参数) 变量
读取输入赋值给变量
-p 指示读取值时的提示符
-t 指定读取值时等待的时间
read相当于python中的input
read -t 7 -p “enter your choice” NAME
6.函数
系统函数
basename函数截取文件名称
basename [string/pathname]
basename [string/pathname] [suffix]
basename 会只保存路径的最后一项,只剩文件名
dirname 函数
dirname函数与basename作用相反,截取内容相反
获取执行脚本的路径
pw=$(cd `dirname $0`;pwd)
自定义函数
[function] funcname[()] function ,()可写可不写
{
程序
[return xx]
}
返回值由$?获取,返回值(0-255)
注意:必须在调用函数地方之前,先声明函数
一个脚本使用另一个脚本的函数
. 脚本名
函数名
二.shell工具
1.cut命令
cut 命令从文件的每一行剪切字节,字符等数据,并将符合的数据输出
cut [选项参数] filename
默认分隔符是制表符
参数 -f 提取第几列
-d 分隔符 按照指定分割符分割列
2.sed
sed是一种流编辑器,它一次处理一行内容把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区中的内容送往屏幕
接着处理下一行,这样不断重复,知道文件末尾,注意文件的内容没有被改变,除非你使用重定向存储输出
sed [选项参数] 命令 filename
选项参数
-e 有多个命令时使用
-n 只显示处理过的行
命令参数
a 新增
d 删除
s 查找并替换
sed -n '1,/内容/'p 文件 显示第一行到包含匹配内容的那一行
sed -n 'num'p 文件 显示第num行
sed “na 内容” 文件名 在n行后加上内容
sed "s/旧 内容/新内容/g" 文件名 替换,g全局替换,否则只换一个
sed -e "nd" -e "s/旧内容/新内容/g" 文件名 删掉第n行并替换内容
3.awk
awk是一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符,将每行切开,切开的部分再进行分析处理。
命令格式:
awk [选项参数] 'pattern{action1} pattern {action2}.....' 文件名
pattern 表示awk在数据中查找的内容,就是匹配模式 (/内容/ 是匹配格式)
action在找到匹配内容时所执行的一系列命令
在开始和结束地方加上新的内容
BEGIN 在所有数据读取前执行,END在读取所有数据后执行
awk的内置变量
FILENAME 文件名
NR 已读的记录数(执行到第几行)
NF浏览记录的域的个数(切割后,列的个数)
显示文本空行行数与具体行号
提取特定文本
统计文本有几行
查找文件空行所在的行号
$0代表一行所有内容,$1-$9代表第一列到第九列
sort 工具
将文件进行排序,并将排序结果标准输出
sort(选项)(参数)
-n 依照数值大小排序
-r 以相反顺序排序
-t 设置排序使用的分割字符
-k 指定需要排序的列
参数:指定需要排序的文件
求一列的和
三.shell中一些重要命令
重定向
>>追加
>写入(覆盖写)
2> 重定向标准错误
2>>重定向标准错误
&>重定向标准输出和标准错误
管道操作符号|
前面的内容交给后面处理
wc -l
判断输出内容有几行
输出命令echo
echo 内容 输出一行默认换行
单独echo 相当于空行
echo -e 内容 可以转义字符 (\n,\t)
echo -n 内容 不转义字符
echo 注意事项:
echo “内容” 与 echo '内容'区别
双引号可以包含变量,但单引号不能解析变量
反引号可以解析命令
设置字体颜色
echo -e “\033[x;ym 内容 \033[0m”
x 字体颜色 30~37
y 背景颜色 40~47
head
输出文件前10行
find
find 搜索区域 -name 文件名 以名字查询文件(模糊查询用*)
find 搜索区域 -perm 权限 根据权限查询
find 搜索区域 -user 用户 根据使用者查询
find 搜索区域 -type 文件类型(d,f) 根据文件类型查找
find 搜索区域 -size 文件大小 根据文件大小查询(+大于,-小于,c字节,k,M)
find 搜索区域 -mtime 时间 根据修改时间查找(+超过多少天,-在几天内)
shell正则
grep “匹配内容” 文件名
grep -c ‘匹配内容’ 文件
grep -n ‘匹配内容’ 文件
grep -i "匹配内容" 文件 忽略大小写
grep -v “内容xx” 文件 不包含内容xx的行(除去特定行)
grep -E “^xx”/"xx$" 以xx开始和以xx结束(-E代表使用正则)
grep -E ".+xx.+" 内容xx 在行中间
grep -E "^$" 文件 匹配空行
grep -E “(xx)+” 文件 匹配多次出现一次或多次xx的行
grep -E “(xx){num}” 文件 匹配连续出现num次的xx行
uniq命令
uniq -c 文件 打印紧挨着的重复行次数与内容(重复但隔着的不打印)
uniq -d 文件 只打印重复的行
split
split -n 被分割文件 保存文件 每n行分割,保存到文件中
查看 是否安装服务
rpm -qa | grep 服务名
查看服务是否正常
nc -w num ip 端口名 有正常的显示,服务正常
制作菜单
cat <
内容
eof
cat <