shell脚本以及三剑客的简单回顾与应用
侧边栏壁纸
  • 累计撰写 18 篇文章
  • 累计收到 3 条评论

shell脚本以及三剑客的简单回顾与应用

无冕の神
2026-02-03 / 0 评论 / 1 阅读 / 正在检测是否收录...

单引号'':会让内部的一些特殊符号失效
双引号"":可以让内部的变量正常使用

[root@server1 ~]# a=1 && (a=2;echo "子shell中a=$a") && echo "子shell外a=$a"
子shell中a=2
子shell外a=1

score=80
[ $score -ge 90 ] && echo "获得三好学生荣誉"
[ $score -ge 90 ] || echo "没有获得三好学生荣誉"

grep作用:过滤文本内容
选项 描述
-E :--extended--regexp 模式是扩展正则表达式(ERE)
-i :--ignore--case 忽略大小写
-n: --line--number 打印行号
-o:--only--matching 只打印匹配的内容
-c:--count 只打印每个文件匹配的行数
-B:--before--context=NUM 打印匹配的前几行
-A:--after--context=NUM 打印匹配的后几行
-C:--context=NUM 打印匹配的前后几行
--color[=WHEN] 匹配的字体颜色,别名已定义了
-v:--invert--match 打印不匹配的行
-e 多点操作eg:grep -e "^s" -e "s$"

通过正则表达式grep出IP地址

ifconfig ens160 | grep inet | grep -E '.' | grep -oE '([[:digit:]]{1,3}.){3}[[:digit:]]{1,3}' | head -1

sed常见参数:
‐n :只打印模式匹配的行
‐e :直接在命令行模式上进行sed动作编辑,此为默认选项
‐f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
‐r :支持扩展表达式
‐i :直接修改文件内容

通过sed替换掉IP地址前后的内容

ifconfig | sed -n '/netmask/p' | sed 's/^.inet //g' | sed 's/ netmask.$//g' | sed -n '1p'

通过sed -i替换修改文件里的内容

sed 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config -i

awk

-F:指定分隔符
-f:指定文件

常用 awk 内置变量
变量名 属性
$0 当前记录
$1~$n 当前记录的第n个字段
FS 输入字段分割符 默认是空格
RS 输入记录分割符 默认为换行符
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始
OFS 输出字段分割符 默认也是空格
ORS 输出的记录分割符 默认为换行符

通过awk对竖着的内容进行累加求和,之后可以用于其他分析工作

awk 'BEGIN{sum=0;count=0} {if ($2=="shuxue"){count++;sum+=$3}} END{avg=sum/count;print "avg: " avg}' testfile

使用awk数组,用字段的名字作为数组的索引,对应的数值为该字段出现的次数

netstat -an | awk '/^tcp/{++s[$6]} END{for (a in s) print a,s[a]}'
运行脚本的方式

给脚本x权限,并通过文件路径的方式运行脚本
直接运行解释器,将脚本作为解释器的参数

退出状态码0-255

在脚本结束的时候可以通过exit关键字指定退出状态码
可以通过$?来查询退出状态码

只读变量

readonly 变量

删除变量

unset 变量

位置变量

$0:脚本名
$1,$2....:第一个、第二个参数
$#:参数个数
$*:所有参数
$@:所有参数,但可以迭代一次取出每个参数

字符串拼接
name2="black"
str3="hello, "${name2}
str4="hello, ${name2}"
字符串长度
echo ${#text}
字符串截取
echo ${#text:2:2}
创建数组
array_name=(value1 value2 value3 ...)
array_name=([0]=value1 [1]=value2 ...)

获取数组的元素
[root@server1 ~]# echo "First fruit: ${fruits[0]}"
First fruit: apple
[root@server1 ~]# echo "First fruit: ${fruits[@]}"
First fruit: apple banana orange
[root@server1 ~]# echo ${nums[*]}
nls 18 teacher

获取元素的个数
[root@server1 ~]# echo ${#nums[*]}
3
[root@server1 ~]# echo ${#nums[@]}
3

删除元素
[root@server1 ~]# unset nums[0]
[root@server1 ~]# echo ${nums[@]}
18 teacher
[root@server1 ~]# echo ${nums[0]}

[root@server1 ~]# echo ${nums[1]}
18
[root@server1 ~]# echo ${nums[2]}
teacher
[root@server1 ~]# echo ${#nums[@]}
2

数学计算
[root@server1 ~]# x=1
[root@server1 ~]# y=2
[root@server1 ~]# z=expr $ + ${y}
[root@server1 ~]# echo $z
3
[root@server1 ~]# x=2
[root@server1 ~]# y=3
[root@server1 ~]# z=$[$x + $y]
[root@server1 ~]# echo $z
5
$((num1 + num2))
let sum+=$i

数值判断
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于

将命令的执行结果赋值给变量
val=expr $ + ${y}
userid1=$(awk -F: '{if (NR==10) print $3}' /etc/passwd)

用户交互read
常用选项
选项 描述
-p 在读取输入之前显示提示信息
-n 限制输入的字符数
-s 隐藏用户输入
-a 将输入存储到数组变量中
-d 指定用于终止输入的分隔符
-t 设置超时时间(以秒为单位)
-e 允许使用 Readline 编辑键
-i 设置默认值

for循环的用法
[root@server1 ~]# for i in {1..5};do echo $i;done
[root@server1 ~]# for ((i=0;i<10;i++))do echo $i;done

当条件不成立的时候结束循环
while 条件
do
...
done

当条件成立的时候结束循环
until 条件
do
...
done

break:结束while、until、for循环
continue:结束循环中的某一轮

定义函数
function FUNNAME(){
函数体
返回值
}
FUNNME #调用函数

$- 输出的 himBHs 是当前 Shell 启用的选项标志组合,每个字母对应一项具体功能,含义如下:

h:启用哈希表(hashall)
Shell 会将执行过的命令路径缓存到哈希表中,再次执行时无需重新搜索 $PATH,加速命令查找。
i:交互式 Shell(interactive)
表示当前 Shell 是交互式的(如终端直接输入命令的环境),而非脚本运行的非交互式环境。
交互式 Shell 会提供命令行提示符、历史记录等功能。
m:启用作业控制(monitor)
允许使用 & 后台运行进程,以及 fg/bg/jobs 等命令管理前台 / 后台作业。
B:启用花括号扩展(brace expansion)
支持类似 a{1,2,3} 扩展为 a1 a2 a3、{1..5} 扩展为 1 2 3 4 5 的语法。
H:启用历史扩展(history expansion)
允许使用 ! 相关语法调用历史命令,例如 !! 重复上一条命令,!n 执行历史记录中第 n 条命令。
s:从标准输入读取命令(stdin)
通常在非交互式 Shell 中启用(如通过管道传递命令时),表示 Shell 会从标准输入而非脚本文件读取命令执行。
0

评论 (0)

取消