shell脚本、sed流式编辑器

一、shell基础
1、shell 概念
shell 英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。可以通过shell 命令来操作和控制操作系统,比如Linux中的shell命令就包括 ls、cd、pwd 等等。
shell 在内核的基础上编写的一个应用程序,它连接了用户和 Linux 内核,从而让用户能够更加便捷、高效、安全的使用 linux 内核,这其实就是 shell 的本质。
使用专业术语的说法来解释,Shell 其实是一个命令解释器,它通过接受用户输入的 Shell 命令来启动、暂停、停止程序的运行或对计算机进行控制。
2、shell 脚本
shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行,它从一定程度上减轻了工作量,提高了工作效率,还可以批量、定时处理主机,方便管理员进行设置或者管理。
[root@cang ~]# vim helloworld.sh
#!/bin/bash
echo "hello world!"
[root@cang ~]# bash helloworld.sh 
hello world!
[root@cang ~]# sh helloworld.sh 
hello world!
[root@cang ~]# source helloworld.sh 
hello world!
[root@cang ~]# chmod +x helloworld.sh 
[root@cang ~]# ./helloworld.sh 
hello world!
[root@cang ~]# vim /root/shell/install_nginx.sh
#!/bin/bash
yum -y install gcc gcc-c++ make pcre-devel openssl-devel wget
cd /usr/local/src/
wget 'https://nginx.org/download/nginx-1.22.1.tar.gz'
tar xf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/usr/local/nginx
make -j 4
make install
[root@cang shell]# bash install_nginx.sh 
四、变量
1、概念
变量用来存放系统或用户需要使用的特定参数或者值,变量的值可以根据用户设定或者系统环境变化而相应变化,在Shell脚本中使用变量,可使脚本更加灵活,适应性更强。
与变量相对应的是常量,常量例如“Hello World”,是不可改变的
变量可以给个变量名,假如为name,值是可变的
2、变量注意事项
变量命名规则:必须由大写字母、小写字母、下划线、数字,并且首字母不能是数字
在变量命名时:建议也简写出该变量是什么用处
变量值的类型:值的类型会分为整型、浮点型、字符串型、布尔型等,而且使用变量需要指定类型Shell 默认的变量类型都是字符串,无需指定类型
[root@cang shell]# env //查看所有环境变量
(3)位置变量
通过命令行给脚本程序传递参数 (也属于预定义变量)
为了在使用Shel脚本程序时,方便通过命令行为程序提供操作参数,Bash引入了位置变量的概念位置变量有 ,n,n为1~9之间的数字
$0:第一个字段表示命令名或脚本名称
$1:脚本要处理的第一个参数
$2:脚本要处理的第二个参数
....
Shell脚本最多可以直接处理9个参数
(4)预定义变量
Bash中内置的一类变量,不能直接修改
预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$*:将所有参数作为整体
$@:单个参数的组合,每个参数占一行
$0:保存了脚本名称
$?:保存命令或脚本的执行状态码
$#:保存脚本要处理的参数的个数
4、变量的定义与输出
(1)定义一个新的变量
格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写
(2)变量符号运用
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号: 或$(): 命令替换,提取命令的执行结果
(3)输入和输出
输入格式:read [-p "显示的提示信息"] 变量名
输出格式:echo $变量名
5、变量的作用范围
默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变量。当进入子程序或新的子shell 时,局部变量将无法再使用。
为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”。
格式 1:export 变量名
格式 2:export 变量名=值
6、变量的数学运算
(1)整数运算
格式:expr 变量1 运算符 变量2 运算符 变量3....
运算符:+ - * /(+ - × ÷)
[root@cang shell]# vim test001.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
echo $5
[root@cang shell]# bash test001.sh 1 2 3 4 5
1
2
3
4
5
[root@cang shell]# vim yonghu.sh
#!/bin/bash
useradd $1
echo $2 | passwd --stdin $1
[root@cang shell]# bash yonghu.sh www ww
更改用户 www 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@cang shell]# vim s01.sh
#!/bin/bash
#将所有的脚本参数输出在终端
for x in "$*"
do
 echo $x
done
[root@cang shell]# bash s01.sh 1 q 2 w 3 e
1 q 2 w 3 e
[root@cang shell]# vim wang.sh
#!/bin/bash
read -p "输入网址" weburl
ping -c 3 $weburl &> /dev/null
if [ $? -eq 0 ]; then
  echo "网络畅通"
else
  echo "网络不通"
fi
[root@cang shell]# sh wang.sh 
输入网址www.baidu.com
网络畅通
[root@cang shell]# vim zifu.sh
#!/bin/bash
read -p "请输入账号" user
echo $user
if [ $user == "admin" ]; then
  echo "欢迎登陆: $user"
else
  echo "账号或密码错误"
fi 
[root@cang shell]# bash zifu.sh 
请输入账号admin
admin
欢迎登陆: admin
[root@cang shell]# vim rpm1.sh
#!/bin/bash
rpm -qa | grep nginx
if [ $? -eq 1 ]; then
 yum -y install nginx
else
 yum -y remove nginx
 yum -y install nginx
fi
[root@cang shell]# bash rpm1.sh 
三、数字判断
1、格式
-eq:equal,等于,一般用于 [ $? -eq 0 ],也就是判断上条命令返回值等于 0,直接数字 -eq 数
字也可以 equals
-ne:not equal,不等于,一般用于 [ $? -ne 0 ],判断上条命令返回值不等于 0
-gt:greater than,大于
-ge:greater or equal,大于或等于
-lt:less than,小于
-le:less or equal,小于或等于
四、字符串判断
1、格式
[ 字符串1 == 字符串2 ] 字符串内容相同
[ 字符串1 != 字符串2 ] 字符串内容不同
[ -z 字符串 ] 字符串内容为空
[ -n 字符串 ] 字符串内容不为空
五、文件、目录、权限的判断
1、格式
[ 操作符 文件或目录]
常用的测试操作符:
-e "文件目录或自定变量" 判断文件或目录是否存在 exists
-f "文件目录或自定变量" 判断是否为文件 isfile
-d "文件目录或自定变量" 判断是否为目录 isdirect
-w "文件目录或自定变量" 判断是否可写 w
-r "文件目录或自定变量" 判断是否可读 r
-x "文件目录或自定变量" 判断是否可执行 x
-s "文件目录或自定变量" 判断文件大小,非0时为真 (若为非空文件,则为真) size
-z "文件目录或自定变量" 判断变量参数值是否为空,为空为真,非空为假 zore
六、与或判断
判断多个条件
多个条件其中一个成立,或
多个条件都要成立,与
或运算判断:|| 或,两个条件满足其一即可,还有-o
与运算判断:&& 与,两个条件都得满足才行,还有
[root@localhost test]# vim yu.sh
#!/bin/bash
read -p "请输⼊⼀个数值:" age
if [ $age -gt 30 ]&&[ $age -lt 80 ];then # 这两个条件都得满足,大于30且小于
80,可使用[ $age -gt 30 -a $age -lt 80 ]
echo "age>30 and age<80"
echo "working"
else
echo "in else"
fi
[root@localhost test]# sh ./yu.sh
请输⼊⼀个数值:60
age>30 and age<80
working
[root@localhost test]# sh ./yu.sh
请输⼊⼀个数值:90
in else
七、多重判断语法 elif
if 条件1; then
#命令,条件1成⽴执⾏
elif 条件2;then
#命令,条件1不成⽴,条件2成⽴执⾏
elif 条件3;then
#命令,条件1不成⽴,条件2不成⽴,条件3成⽴执⾏
else
#命令 ,以上条件都不成⽴执⾏
fi
八、多重判断的 case 语句
1、case 语句概述
case 语句是多分支选择语句
使用case语句改写if多分支可以使脚本结构更加清晰、层次分明。针对变量的不同取值,执行不同
的命令序列,case还支持正则。
2、case 语句的结构
case $变量名称 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认命令序列
esac
一、shell读取用户输入
[root@cang shell]# read -p "3个变量" a b c
3个变量12 18 20
[root@cang shell]# echo $a
12
[root@cang shell]# echo $b
18
[root@cang shell]# echo $c
20
[root@cang shell]# vim usr01.sh
#!/bin/bash
read -p "username:" username
read -p "password:" password
useradd $username
echo $password | passwd --stdin $username
if [ $? -eq 0 ]; then
   echo "账户$username注册成功"
fi
[root@cang shell]# bash usr01.sh 
username:bbb
password:bbb
useradd:用户“bbb”已存在
更改用户 bbb 的密码 。
passwd:所有的身份验证令牌已经成功更新。
账户bbb注册成功
二、脚本的数学运算
一、for 循环
1、作用
读取不同的变量值,以逐个执行同一组命令
2、结构
for 变量名 in 取值列表(范围)
do
命令序列
done
取值列表:数字范围、字符串、多个字符串、提前设定好的变量等
for默认以所有的空白字符进行分隔: tab、空格、回车,去循环处理
分隔成几段就循环几次
[root@localhost test]# vim quzhi.sh
#!/bin/bash
for home in 北京 上海 ⼴州 深圳 # home变量在北京、上海、广州、深圳这四个地名中间循环一

do
echo "$home 是个好地⽅!"
done
[root@localhost test]# bash quzhi.sh
北京 是个好地⽅!
上海 是个好地⽅!
⼴州 是个好地⽅!
深圳 是个好地⽅!
二、while 循环
1、作用
重复测试某个条件,只要条件成立则反复执行
2、结构
while 条件测试操作
do
命令序列
done
3、while 和 for区别
while循环也有条件判断,当条件成立的时候,会循环执行。当条件不成立退出
if判断当条件成立时,会执行一次,然后退出。当条件不成立时直接退出
[root@localhost test]# vim 99.sh
#!/bin/bash
#九九乘法表
for i in {1..9};do
for j in {1..9};do
echo -n "$j*$i=$(($i*$j)) "
if [ $j == $i ];then
echo -e '\n'
break
fi
done
done
[root@localhost test]# bash 99.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

sed流式编辑器
一、概述
sed 是文本处理工具,读取文本内容,根据指定条件进行处理,可实现增删改查的功能。sed 依赖于正则表达式。
1、格式
sed '过滤+动作' 文件路径
2、选项
-e 指定要执行的命令 (操作) ,只有一个编辑命令 (操作) 时可省略
-n 只输出处理后的行,读入时不显示,不对原文件进行修改
-i 直接修改源文件,不输出结果
二、编辑命令格式
'/地址 1,地址 2/操作(参数)'
1、地址
可为行数、正则表达式、$,没有地址代表全文
2、操作
p 打印(输出)
d 删除(整行)
s 替换(字符串匹配)
c 替换(整行)
r 读取指定文件(追加到行后)
a (append)追加到指定内容到行后
i (insert)追加指定内容到行前
w 另存为
n 表示读入下一行内容
H 复制到剪贴板
g 将剪贴板中的内容覆盖到指定行
G 将剪贴板中的内容追加到指定行后
[root@localhost test]# vim test.txt
gd
god
good
goood
gooood
gold
glad
gaad
abcdEfg
food
60115127Z
HELLO
010-66668888
0666-5666888
IP 192.168.1.108
IP 173.16.16.1
pay $180
[root@localhost test]# sed -n '12p' test.txt #输出第12⾏内容
HELLO
[root@localhost test]# sed -n '3,5p' test.txt # 输出3~5⾏内容
good
goood
gooood
[root@localhost test]# sed -n 'p;n' test.txt #输出奇数⾏
gd
good
gooood
glad
abcdEfg
60115127Z
010-66668888
IP 192.168.1.108
pay $180
[root@localhost test]# sed -n 'n;p' test.txt #输出偶数⾏
god
goood
gold
gaad
food
HELLO
0666-5666888
IP 173.16.16.1
[root@localhost test]# sed -n '1,6{p;n}' test.txt # 输出1~6⾏之间的奇数⾏(第1,3,5⾏)
gd
good
gooood
[root@localhost test]# sed -n '/H/p' test.txt # 输出包含字⺟H的⾏
HELLO
[root@localhost test]# sed -n '/[A-Z]/p' test.txt # 输出所有包含⼤写字⺟的⾏
abcdEfg
60115127Z
HELLO
IP 192.168.1.108
IP 173.16.16.1
[root@localhost test]# sed -n '$p' test.txt #输出最后⼀⾏
pay $180
(3)d 删除
[root@localhost test]# sed '16d' test.txt # 删除第十六行
[root@localhost test]# sed -i '/^$/d' test.txt # 删除空行,^$:表示空行
(4)s 替换字符串
[root@localhost test]# sed 's/o/O/g' test.txt # 将所有⼩写o替换为⼤写O(g表示若同⼀⾏有多个⼩写o,全部替换,若不加g,则只替换每⾏的第⼀个⼩写o)
[root@localhost test]# sed '/^IP/ s/^/#/' test.txt #以IP开头的⾏,⾏⾸加上
[root@localhost test]# sed 's/$/EOF/' test.txt # 在每⾏⾏尾插⼊字符串EOF
(5)c 替换整行
[root@localhost test]# sed '2cAAAAAAA' test.txt #将第2⾏替换为AAAAA
(6)r 追加指定文件到行后
[root@localhost test]# sed '5r /etc/hostname' test.txt # 读取/etc/hostname⽂件内容在第5⾏后
(7)a 追加指定内容到行后
[root@localhost test]# sed '2aCCCCCCCCC' test.txt #在第二行后追加9个C
(8)i 追加指定内容到行前
[root@localhost test]# sed '2iCCCCC' test.txt # 在第二行之前追加5个C
(9)w 另存为
[root@localhost test]# sed '15,16w 123.txt' test.txt # 将15~16⾏内容另存到123.txt⽂件中
(10)H 和 G 复制剪切粘贴
H:复制到剪贴板
G:将剪贴板中的内容追加到指定行后
[root@localhost test]# sed '/IP/ {H;d};$G' test.txt  # 将包含字⺟IP的⾏剪切到最后⼀⾏下
[root@localhost test]# sed '1,5H;15,16G' test.txt  #将1~5⾏内容复制到15⾏、16⾏下
三、sed 命令引用变量
1. sed命令使用单引号的情况下,可以使用 '"$var"' 引用(单引号,然后双引号,变量):
sed -i '2s/node_base/'"$i"'/' /etc/libvirt/qemu/$i.xml
1. sed命令中使用双引号的情况下,直接 shell command 或者 $(shellcommand) 引用命令执行。
sed -i "2s/node_base/$i/" /etc/libvirt/qemu/$i.xml

#!/bin/bash

# 备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak

read -p "请输入指定ip地址:" ip

# 替换dhcp 为 none
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
# 在文档最后添加5行

[root@cang shell]# vim initserver.sh 
# IPADDR
#!/bin/bash

# 备份
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak

read -p "请输入指定ip地址:" ip

# 替换dhcp 为 none
sed -i '/dhcp/s/dhcp/none/g' /etc/sysconfig/network-scripts/ifcfg-ens33
# 在文档最后添加5行


# IPADDR
sed -i '$aIPADDR='"$ip"'' /etc/sysconfig/network-scripts/ifcfg-ens33
# NETMAST

sed -i '$aNETMASK=255.255.255.0' /etc/sysconfig/network-scripts/ifcfg-ens33
#GATEWAY
sed -i '$aGATEWAY=10.1.1.2' /etc/sysconfig/network-scripts/ifcfg-ens33

#DNS1
sed -i '$aDNS1=8.8.8.8' /etc/sysconfig/network-scripts/ifcfg-ens33


#DNS2
sed -i '$aDNS2=114.114.114.114' /etc/sysconfig/network-scripts/ifcfg-ens33
#修改uuid

# 修该主机名称
read -p "请输入主机名称" hn
hostnamectl set-hostname $hn

# 停用selinux
setenforce 0
sed -i '/SELINUX=enforcing/cSELINUX=disabled'  /etc/selinux/config

#停用防火墙
systemctl stop firewalld
systemctl disable firewalld

# 停用NetworkManage
systemctl stop NetworkManager
systemctl disable NetworkManager

# 重启网络服务
systemctl restart netword

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sed是一种在Linux下非交互式的流式文本编辑器,它可以对文本文件进行增、删、改、查等操作。可以通过在shell脚本中使用sed命令来实现对文本文件的处理。 在给定的引用中,已经提到了sed的基本用法和其在shell脚本中的使用示例。你可以根据需求使用不同的sed命令来实现不同的文本操作。以下是一些常见的sed命令和它们的用法: 1. 替换文本: 使用"s/old-text/new-text/g"命令可以将文本中的"old-text"替换为"new-text",并且"g"表示全局替换。 2. 删除行: 使用"d"命令可以删除指定行数的文本。 3. 插入或添加行: 使用"i"命令可以在指定行之前插入新的行,使用"a"命令可以在指定行之后添加新的行。 4. 查找匹配的行: 使用"/pattern/"命令可以查找包含特定模式的行。 5. 使用正则表达式: sed支持使用正则表达式来匹配和操作文本。你可以使用正则表达式来定义需要匹配的模式。 除了上述提到的基本用法,还有许多其他的sed命令和选项可以用于不同的文本操作。你可以通过阅读sed命令的官方文档来获得更详细的信息和示例。 在给定的引用中,展示了一个使用sed命令的脚本文件的示例。这个脚本用于调整vsftpd服务的配置,禁止匿名用户,允许本地用户,并允许写入。它通过使用sed命令修改配置文件来实现这些配置更改,并使用systemctl命令来启动和设置vsftpd服务。 希望这些信息对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值