shell

shell变量

  • env 查看所有环境变量

  • set 查看所有变量

自定义变量 a=10 echo $a unset a a= echo ${a}RMB

环境变量 USER UID HOME HOSTNAME SHELL PWD PATH PS1 (一级提示符) PS2 (二级)

位置变量与预定义变量

$1 执行脚本时后面第1个位置参数 $2 $3

$* 执行脚本时后面所有位置参数

$# 执行脚本时后面位置参数的个数

$$ 当前程序的进程号(该号码是随机的)

$? 判断上一条指令是否执行成功,0是成功,非0是失败

变量的扩展知识

“ “ 双引号 界定范围

‘ ‘ 单引号 界定范围 屏蔽特殊符号的功能

` ` 反撇号 获取命令的执行结果,还可以使用$( )实现相同效果

read -p “内容:” u //输入语句,-p是可以定义提示信息,u为变量

运算指令:1. expr命令 2. $[ ]运算,使用$(( )) 相同 3. let命令专用变量创建 4. bc命令计算器

字符串删除:

  • echo ${a#*c} a变量从左往右删除到第1个c a变量echo ${a##*c} 从左往右删除到最后1个c
  • echo ${a%b*} a变量从右往左删除到第1个b echo ${a%%b*} a变量从右往左删除到最后1个b

条件测试 test a == a [ a == a ] [ $a == $b ] [ “$c” == $b ](加引号空值不会报错) [ -z $a ](-z为空)

  • 逻辑组合 && ||

  • 数字 -eq 是否相等 -ne 是否不等 -gt 是否大于 -ge 是否大于等于 -lt 是否小于 -le 是否小于等于

  • 文件 -e(判断文件是否存在,不关心类型) -f -d -r -w -x

正则表达式

正则符号 描述
^ 匹配行首
$ 匹配行尾
[] 集合,匹配集合中的任意单个字符
[^] 对集合取反
. 匹配任意单个字符
* 匹配前一个字符任意次数[*不允许单独使用]
\{n,m\} 匹配前一个字符n到m次
\{n\} 匹配前一个字符n次
\{n,\} 匹配前一个字符n次及以上
\{\} 保留
+ 最少匹配一次
最多匹配一次
{n,m} 匹配n到m次
() 组合为整体,保留
| 或者
\b 单词边界
\w 匹配数字、字母、下划线
\s 匹配空格、tab键
\d 匹配数字,和[0-9]等效

sed 流式编辑器

  • 可以对文档进行非交互式增删改查,逐行处理

  • 选项: -n 屏蔽默认输出 -r 支持扩展正则 -i 修改源文件

  • 指令: p 输出 d 删除 s 替换 a行下追加 i行上添加 c替换整行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sed -n  '2,4p'  user   //输出2~4行
sed -n '2p;4p' user //输出第2行与第4行
sed -n '3,+1p' user //输出第3行以及后面1行
sed -n '/^root/p' user //输出以root开头的行
sed -n '/root/p' user //输出包含root的行
sed -nr '/^root|^bin/p' user //输出以root开头的行或bin开头的行,|是扩展正则,需要r选项
sed -n '1!p' user //输出除了第1行的内容,!是取反
sed -n '$p' user //输出最后一行
sed -n '=' user //输出行号,如果是$=就是最后一行的行号
sed '3s/2017/6666/3' shu.txt //把第3行的第3个2017替换成6666
sed 's/2017/6666/g' shu.txt //所有行的所有个2017都替换
sed '/2024/s/2017/6666/g' shu.txt //找含有2024的行,将里面的所有2017替换成6666
sed '/^bin/a 666' user //在以bin开头的行的下面追加666
sed '$i 666' user //最后1行的上面添加666
sed 'c 666' user //所有行都替换成666

awk

  • 可以实现精确搜索并输出,逐行处理

  • 选项 -F 定义分隔符

  • 指令 print

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
awk '{print}' abc.txt    //输出所有
awk '/to/{print}' abc.txt //输出有to的那行
awk '{print $2}' abc.txt //输出所有行的第2列
awk '/to/{print $1}' abc.txt //输出有to的那行的第1列
awk '{print $0}' abc.txt //输出所有行所有列
awk '{print $0,$1}' abc.txt //输出所有行所有列,第1列
awk '{print NR}' abc.txt //输出所有行的行号
awk '{print NR,$0}' abc.txt //输出所有行的行号,所有列
awk '{print NR,NF}' abc.txt //输出所有行的行号,列号(有几列)
awk '/^bin/{print NR}' user //找以bin开头的行,显示该行的行号
awk '/^bin/{print NR,$0}' user //找以bin开头的行,显示该行的行号,所有列
awk '{print NF}' user //输出所有行的列号(每行有几列)
awk -F: '{print $1}' user //文档中如果没有空格,可以用F修改分隔符
awk -F: '{print $1,$6}' user //使用冒号作为列的分隔符,显示第1、6列
awk -F: '{print $1" 的家目录是 "$6}' user //还可以输出常量,加双引号即可
awk -F: '{print $1" 的解释器是 "$7}' user
更新于

请我喝[茶]~( ̄▽ ̄)~*

Chen 微信支付

微信支付

Chen 支付宝

支付宝

Chen 贝宝

贝宝