IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> shell脚本 -> 正文阅读

[系统运维]shell脚本

shell是什么

shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至是编写一些程序.

脚本格式要求

1.脚本以#!/bin/bash开头
2.脚本需要有可执行权限(即x)

脚本的执行方式

方式1:首先要赋予脚本x权限,再执行脚本
如:有一个helloworld.sh脚本
chmod 744 helloworld.sh给所有用户一个x权限
./helloworld.sh(相对路径)或/root/shell/helloworld.sh(绝对路径)执行脚本
方式2:sh 脚本,此时不用赋予脚本x权限,直接执行即可
如:sh ./helloworld.sh(相对路径)

#编写helloworld.sh脚本
#!/bin/bash
echo "helloworld"

[root@localhost myshell]# sh helloworld.sh 
helloworld
[root@localhost myshell]# sh /root/myshell/helloworld.sh 
helloworld
[root@localhost myshell]# chmod 744 helloworld.sh
[root@localhost myshell]# ./helloworld.sh
helloworld
[root@localhost myshell]# /root/myshell/helloworld.sh 
helloworld

shell的变量

Linux Shell中的变量分为:系统变量用户自定义变量
系统变量:$HOME,$PWD,$SHELL,$USER等,比如:echo $HOME
显示当前shell中的所有变量:set
1.定义变量:变量=值
2.撤销变量:unset 变量
3.声明静态变量:readonly 变量
注意:静态变量不能unset
定义变量的规则:
1.变量名称可以由字母,数字和_组成,但是不能以数字开头
2.等号两边不能有空格
3.变量名称一般习惯为大写
将命令的返回值赋给变量:
A=`ls -a`反引号,运行里面的命令,并把结果返回个变量A
A=$(ls -a)等价于反引号

设置环境变量

1.export 变量名=变量值,将shell变量输出为环境变量
2.source 配置文件(/etc/profile),让修改后的配置信息立即生效
3.echo $变量名,查询环境变量的值

注释

#单行注释
:<<!多行注释!

位置参数变量

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量.比如:./helloworld.sh 200,这个就是执行shell的命令行,可以在helloworld脚本中获取到参数信息

$nn为数字,$0代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 ‘ 9代表第一到第九个参数,十以上的参数需要用大括号包含,如` 9,,{10} `
$*这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,$@把每个参数区分对待
$#这个变量代表命令行中所有参数的个数

预定义变量

预定义变量:就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用

$$当前进程的进程号(PID)
$!后台运行的最后一个进程的进程号(PID)
$?最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确执行.如果这个变量的值为非0 ,则证明上一个命令执行不正确

运算符

1.$((运算式))$[运算式]
2.expr m + n,注意:expr运算符间要有空格
expr \*,/,% ,除,取余
如要计算(2+3)*4:
方式1:result=$(((2+3)*4))
方式2:result=$[(2+3)*4]
方式3:temp=`expr 2 + 3`
result=`expr $temp * 4`

条件判断

[ 条件 ] 注意条件前后要有空格
#非空返回true
如:
[ 条件 ] 返回true(非空)
[ ] 返回false
[ 条件 ] && echo DK || echo notok 条件满足,执行后面的语句
常用判断条件:

两个整数的比较
-lt小于
-le小于等于
-eq等于
-gt大于
-ge大于等于
-ne不等于
=字符串比较
按照文件权限进行判断
-r有读的权限
-w有写的权限
-x有执行的权限
按照文件类型进行判断
-f文件存在并且是一个常规的文件
-e文件存在
-d文件存在并且是一个目录

if elif

if [ 条件判断式 ];then
程序
fi
或者:
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
then
程序
fi
注意:[ 条件判断式 ],中括号和条件判断式之间必须有空格

case语句

case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
...省略其它分支
*)如果变量的值都不是以上的值,则执行此程序
;;
esac

for循环

基本语法1:
for 变量 in 值1 值2 值3 …
do
程序
done
基本语法2:
for((初始值;循环控制条件;变量变化))
do
程序
done

while循环

while [ 条件判断式 ]
do
程序
done

read

read读取控制台输入
基本语法:read(选项)(参数)

选项
-p指定读取值时的提示符
-t指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
参数
变量指定读取值的变量名

函数

shell编程和其它编程语言一样,有系统函数,也可以自定义函数.
1.系统函数:
basename返回完整路径最后/的部分,常用于获取文件名
basename [pathname] [suffix],suffix为后缀,如果suffix被指定了,basename会将pathname中的suffix去掉
dirname返回完整路径最后/的前面的部分,常用于返回路径部分
dirname 文件绝对路径,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分).
2.自定义函数:
基本语法:
[ function ] funname[()]
{
Action;
[return int;]
}
#中括号中的可不写
调用直接写函数名:funname [值]

cut

cut的工作就是’剪’,就是在文件中负责剪切数据用的.cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出.
cut [选项参数] filename
说明:默认分隔符是制表符

选项参数功能
-f列号,提取第几列
-d分隔符,按照指定分隔符分割列
[root@localhost myshell]#touch cut.txt
[root@localhost myshell]#vim cut.txt
#切割cut.txt第一列
[root@localhost myshell]#cut -d " " -f 1 cut.txt
#切割cut.txt第二,三列
[root@localhost myshell]#cut -d " " -f 2,3 cut.txt
#在cut.txt文件中切割出guan
[root@localhost myshell]#cat cut.txt | grep "guan" |cut -d " " -f 1

sed

sed是一种流编辑器,它一次处理一行内容.处理前,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.
sed [选项参数] command filename

选项参数功能
-e直接在指令列模式上进行sed的动作编辑
命令功能描述
a新增,a的后面可以接字符串,在下一行出现
d删除
s查找并替换
[root@localhost myshell]#vim sed.txt
#将"hello world"这个字符串插入到sed.txt第二行下面(第三行),打印
[root@localhost myshell]#sed '2a helloworld' sed.txt
#删除sed.txt文件所有包含wo的行
[root@localhost myshell]#sed '/wo/d' sed.txt
#将sed.txt文件中wo替换成ni
注意:'g'表示global,全部替换
[root@localhost myshell]#sed "s/wo/ni/g" sed.txt
#将sed.txt文件中的第二行删除并将wo替换为ni
[root@localhost myshell]#sed -e "2d" -e "s/wo/ni/g" sed.txt

awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理.
awk [选项参数] 'pattern1{action1} pattern2{action2}...' filename
pattern表示awk在数据中查找的内容,就是匹配模式
action在找到匹配内容时所执行的一系列命令

选项参数功能
-F指定输入文件分隔符
-v赋值一个用户定义变量
#搜索passwd文件以root关键字开头的所有行,并输出该行的第7列
[root@localhost myshell]#awk -F: '/^root/{print $7}' passwd
#搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以","号分割
#注意:只有匹配了pattern的行才会执行action
[root@localhost myshell]#awk -F: '/^root/{print $1","$7}' passwd
#只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列明user,shell在最后一行添加"endend"
#注意:BEGIN在所有数据读取行之前执行,END在所有数据执行之后执行
[root@localhost myshell]#awk -F: 'BEGIN{print "user shell"} {print $1","$7} END{print "endend"}' passwd
#将passwd文件中的用户id增加数值1并输出
[root@localhost myshell]#awk -v i=1 -F: '{print $3+i}' passwd

awk的内置变量

变量说明
FILENAME文件名
NR已读的记录数
NF浏览记录的域的个数(切割后,列的个数)
#统计passwd文件名,每行的行号,每行的列数
[root@localhost myshell]#awk -F: '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF}' passwd
#切割IP
[root@localhost myshell]#ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}'
#查询sed.txt中空行所在的行号
[root@localhost myshell]#awk '/^$/{print NR}' sed.txt

sort

sort命令将文件进行排序,并将排序结果标准输出
sort(选项)(参数)

选项说明
-n依照数值的大小排序
-r以相反的顺序来排序
-t设置排序时所用的分隔符
-k指定需要排序的列

参数:指定待排序的文件列表

[root@localhost myshell]#vim sort.sh
#按照":"分割后的第三列倒序排序
[root@localhost myshell]#sort -t : -nrk 3 sort.sh

面试题

#请用shell脚本写出查找当前文件夹(/home)下所有的文本文件内容包含有字符"shen"的文件名称
[root@localhost myshell]#grep -r "shen" /home | cut -d ":" -f 1
#有文件chengji.txt内容如下:
张三 40
李四 50
王五 60
使用Linux命令计算第二列的和并输出
[root@localhost myshell]#cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'
#shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?
#!/bin/bash
if [ -f file.txt ]
then
	echo "文件存在"
else
	echo "文件不存在"
fi
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 17:10:50  更:2021-12-02 17:12:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:34:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码