shell脚本-函数应用、脚本调试与sed工具

shell函数应用

shell函数也是我们经常要使用的,因为有一些命令序列是需要反复调用执行的,若每次使用同一命令就重复写一遍,就会导致代码量很大,行数特别多。
为解决该问题我们可以将命令序列按格式写在一起,定义为一项函数,以便可以重复使用。
函数定义基本格式👇

[function] 函数名(){     其中function是可选的,表示该函数的功能,可以省略掉
	命令序列
	[return x]    [return x]的作用是当命令执行序列完成后返回给系统一个值,可以省略
}
若有些时候我们调用的函数很多,那么我们可以一次写好几个

举例:

#!/bin/bash
#这是一个计算器
jia(){
	he=$(($A+$B))
}
jian(){
	cha=$(($A-$B))
}
cheng(){
	ji=$(($A*$B))
}
chu(){
	sahng=$(($A/$B))
}		
while [ -z $A ] || [[ $A == *[!0-9]* ]]
do
	read -p "请输入一个数字:"  A
done
read -p '输入你的计算方式( + - x / )'  i
while [ -z $B ] || [[ $B == *[!0-9]* ]]
do
read -p "请输入第二个数字"  B
done
case $i in
+)	
jia	
	echo "$A + $B = $he"
	;;
-)
jian
	echo "$A - $B = $cha"
	;;
x)
cheng	
	echo "$A x $B = $ji"
	;;	
/)
chu
	echo "$A / $B = $sahng"
	;;
*)
	echo '请输入正确的运算符号'
esac	

shell脚本调试

bash内置脚本调试命令👇

sh [-nvx] 脚本名

常用的具体含义为:

  • -n:不会执行该脚本,仅查询脚本语法是否有问题,如果没有语法问题就不显示任何内容,如果有问题会提示报错。
  • -v:在执行脚本时,先将脚本的内容输出到屏幕上然后执行脚本,如果有错误,也会给出错误提示
  • -x:将执行的脚本内容输出到屏幕上,这是个对脚本调试很有用的参数

当脚本文件较长时,可以使用set命令指定一段脚本。

set -x      ###开启调试模式###
case $i in
+)
jia
        echo "$A + $B = $he"
        ;;
-)
jian
        echo "$A - $B = $cha"
        ;;
x)
cheng
        echo "$A x $B = $ji"
        ;;
/)
chu
        echo "$A / $B = $sahng"
        ;;
*)
        echo '请输入正确的运算符号'
esac
set +x    ###关闭调试模式###

sed文本处理工具

sed工具概述

sed是文本处理工具,依赖于正则表达式,可以读取文本内容,根据指定条件对数据进行添加、删除、替换等操作,被广泛应用于shell脚本,以完成自动化处理任务。

  • sed在处理数据时默认不直接修改源文件,而是把当前处理的行存储在临时缓冲区中,所有指令都在缓冲区中操作,处理完成后,把缓冲区内容默认输出到屏幕,接着处理下一行内容,这样不断重复,直到文件末尾,文件本身内容没有改变。

sed基本语法

命令语法:

  • sed -e ' 编辑指令 ' 文件1 文件2 ...
  • sed -n -e ' 编辑指令 ' 文件1 文件2 ...
  • sed -i -e ' 编辑指令 ' 文件 文件2 ...

常用选项:

  • -e 指定要执行的命令,只有一个编辑命令时可以省略。
  • -n 只输出处理后的行,读入时不显示。
  • -i 直接编辑文件,而不输出结果。

sed用法示例

常见操作

指令作用
p输出指定的行
d删除指定的行
s字串替换,格式: “行范围s/ 旧字符串 / 新字符串 /g”
r读取指定文件 使用率低
w保存为文件 使用率低
i插入,在当前行前面插入一行或多行
输出指定的行
将所有内容输出
sed -n 'p' /etc/passwd

将第6行内容输出
sed -n '6p' /etc/passwd

将第6~8行内容输出
sed -n '6, 8p' /etc/passwd

将所有奇数行输出
sed -n 'p;n' /etc/passwd

将所有偶数行输出
sed -n 'n;p' /etc/passwd

将1~10行中的奇数行输出
sed -n '1,10p;n' /etc/passwd

将1~10行中的偶数行输出
sed -n '1,10{n;p}' /etc/passwd

将第10行到末尾之间的奇数行输出
sed -n '10,${n;p}' /etc/passwd

将最后一行输出
sed -n '$p' /etc/passwd

将第1行开始, 连续4行进行输出(1~5行).
sed -n '1,+4p' /etc/passwd

将匹配包含root的行进行输出
sed -n '/root/p' /etc/passwd

将从第10行至第一个包含nom之间的行进行输出
sed -n '10,/nom/p' /etc/passwd

匹配不少于1次前导字符o, 加-r参数:支持拓展正则表达式.
sed -nr '/ro{1,}t/p' /etc/passwd

输出包含root或者ntp的行
sed -n '/root\|ntp/p' /etc/passwd

将包含nom所在的行行号输出, “=”号用来输出行号.
sed -n '/nom/=' /etc/passwd

输出前5行信息后退出, q退出.
sed -e '5q' /etc/passwd

插入符合条件的行
添加多行数据, 除最后一行外, 每行末尾都需要用”\n”符号表示数据未完结, 换行.

在含有root行的前面一行添加admin:x:490:490:/sbin nologin
sed '/root/i admin:x:490:490::/:/sbin/nologin' /etc/passwd

在含有root行的后面一行添加admin:x:490:490:/sbin nologin
sed '/root/a admin:x:490:490::/:/sbin/nologin' /etc/passwd

在第3行之后插入ADMIN
sed '3aADMIN' /etc/passwd

删除符合要求的行
删除第1行
sed '1d' /etc/passwd

删除最后1行
sed '$d' /etc/passwd

删除所有空行
sed '/^$/d' /etc/passwd

删除第2-4行
sed '2,4d' /etc/passwd

删除含有root的行
sed '/root/d' /etc/passwd

删除不包含root的行, 这里的”!”号表示取反操作.
sed '/root/!d' /etc/passwd

删除以root开头的行
sed '/^root/d' /etc/passwd

删除以nologin结尾的行
sed '/nologin$/d' /etc/passwd

替换符号条件的文本
将文件中所有的root都删除
sed 's/root//g' /etc/passwd

将含有root的行替换为admin:x:490:490:/sbin/nlogin
sed '/root/c admin:x:490:490::/:/sbin/nologin' /etc/passwd

把每行的第2个root替换成admin
sed -n 's/root/admin/2p' /etc/passwd

将包含root的所有行中的root都替换为ROOT
sed '/root/s/root/ROOT/g' /etc/passwd

将第1~3行中的所有bin都替换为BIN
sed '1,3s/bin/BIN/g' /etc/passwd/

在每行行尾插入字符串ABC
sed 's/$/ABC/' /etc/passwd

在每行行首插入#号
sed 's/^/#/' /etc/passwd

将包含root的行的行首插入#号
sed '/root/s/^/#/' /etc/passwd

将第一行替换为ABC
sed '1cABC' /etc/passwd

将root对应替换为ROOT, y表示对应替换.
sed 'y/root/ROOT/' /etc/passwd

将第1~10行中的root对应替换为ROOT
sed '1,10y/root/ROOT/' /etc/passwd

迁移符号条件的文本
H表示保存当前模式到一个缓冲区, G表示取出保存的模式.

将包含root的行另存为文件filel
sed '/root/w file1' /etc/passwd

将包含root的行迁移至末尾
sed '/root/{H;d};$G' /etc/passwd

将第1~5行内容迁移至末尾
sed '1,5{H;d};$G' /etc/passwd

将包含root的行迁移至末尾
sed '/root/{H;d};$G' /etc/passwd

执行多次命令
-e可以将多个命令连接起来, 也可将多个编辑命令保存到文件中, 通过-f指定文件, 已完成多个处理操作.

将root和bash行作替换
sed -ne 's/root/admin/' -ne 's/bash/sh/p' /etc/passwd

直接修改文件内容
在每行开头插入#号, 直接修改原文件.
sed -i 's/^/#/' /etc/passwad

将每行开头的#号删除, 直接修改原文件.
sed -i 's/^#//g' /etcpasswd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值