单引号'':会让内部的一些特殊符号失效
双引号"":可以让内部的变量正常使用
[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)