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