Shell学习笔记1
一、第一个shell 程序
mkdir 创建文件夹
cd 切换目录
chmod +x 文件名 给该文件“可执行”的权限
./文件名 执行文件 (需要为文件赋予可执行的权限)
sh/bash 文件名 (不需要文件有可执行的权限)
source 文件名 (不需要文件有可执行的权限,但不会启动子进程)
#!/bin/bash 声明解释器
# 注释内容
二、shell语法
1、变量
定义变量:变量名=变量值
取消变量:ueset 变量名
查看变量:$变量名 / ${变量名}
注意事项:
- =两边不能有空格
- 如果变量名已经存在则覆盖之前的变量值
- 变量名由字母/数字/下划线组成,但不能以数字开头
2、变量类型
1)环境变量(变量名通常大写,有操作系统维护)
存储在/etc/profile或~/.bash_profile
命令env可以列出所有的环境变量
常见的环境变量有:PATH、PWD、USER、UID、HOME、SHELL
2)位置变量(bash内置变量,存储脚本执行时的参数)
使用$n表示,n为数字序列号
$1、$2、... 、${10}、${11}、...
3)预定义变量(bash内置变量,可以调用但是不能赋值或修改)
用来保存脚本程序的执行信息
$0 当前所在的进程或脚本名
$$ 当前运行进程的PID号
$? 命令执行后的返回状态,0表示正常,1或者其他值表示异常
$# 所在位置变量的个数
$* 所在位置变量的值
4)自定义变量(用户自主设置)
3、变量的扩展应用
1)多种引号的区别
双引号"" 允许扩展,以$引用其他变量
单引号'' 禁用扩展
反引号`` 将命令的执行输出作为变量值,$()与反引号等效
2)read命令定义变量(从键盘读入变量值完成赋值)
read [-p "提示信息"] 变量名
-p可选,-t可指定超时秒数,-s设置是否在终端显示输入的内容
3)全局or局部
局部变量:新定义的变量默认只在当前Shell环境中有效,无法在子Shell环境中使用
全局变量:全局变量在当前Shell及子Shell环境中均有效
4、Shell中的运算
1)整数运算
运算符:+、-、*、/、%
$[] 或 $(())
- $[整数1 运算符 整数2 ...]
- 计算结果替换表达式本身,可结合echo命令输出
简写格式和C++一样
2)小数运算
Bash内机制仅支持整数运算,不支持小数运算
我们可以通过计算机软件bc实现小数运算
- 如果没有该软件则需要使用yum安装
- bc支持交互式和非交互式两种方式计算,scale=n可以约束小数位
3)小数的比较
bc支持的比较操作符:>、>=、<、<=、==、!=
表达式成立则返回1,否则返回0
5、条件+循环
1)条件测试
test测试操作,语法格式:
- test 选项 参数
- [选项 参数]
字符串比较,基本语法:(注意空格位置)
- 是否为空[ -z 字符串 ]
- 等于[ 字符串1 == 字符串2 ]
- 不等于[ 字符串1 != 字符串2 ]
整数值比较:
[ 整数值1 操作符 整数值2 ]
操作符 | 含义 |
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-ge | 大于或等于(Greater or Equal) |
-le | 小于或等于(Less or Equal) |
-gt | 大于(Greater Than) |
-lt | 小于(Less Than) |
文件状态测试:
- [ 操作符 文件或目录]
操作符 | 含义 |
-e | 判断对象是否存在(Exit),若存在则结果为真 |
-d | 判断对象是否为目录(Directory),是则为真 |
-f | 判断对象是否为一般文件(File),是则为真 |
-r | 判断对象是否有可读权限(read),是则为真 |
-w | 判断对象是否有可写权限(write),是则为真 |
-x | 判断对象是否具有可执行权限(excute),是则为真 |
使用控制操作符组合多个命令
- ;计算机按顺序执行命令,多个命令之间没有逻辑关系
- &&计算机按顺序执行命令,仅当前一个命令执行成功时,计算机才执行后面的命令
- ||前面的命令执行成功,后面的命令不再执行;前面的命令执行失败,才执行后面的命令
2)if语句
if的单分支判断
- if 条件测试
then 命令序列
if
- if 条件测试;then
命令序列
fi
if双分支判断语法
- if 条件测试
then
命令序列1
else
命令序列2
fi
- if 条件测试;then
命令序列1
else
命令序列2
fi
if多分支判断语法
- if 条件测试1;then
命令序列1
elif 条件测试2;then
命令序列2
... ...
else
命令序列n
fi
3)for循环
语法格式
- for 变量 in 值列表
do
命令序列
done
- for((初值;条件;步长))
do
命令序列
done
4)while 循环
语法格式
- while 条件测试
do
命令序列
done
5)case语句
语法格式
- case 变量 in
模式1)
命令序列1;;
模式2)
命令序列2;;
... ...
*)
默认命令序列
esac
6、数组
7、shell函数
函数定义
- function 函数名{
命令序列
... ...
}
- 函数名(){
命令序列
... ...
}
调用函数
- 函数名
函数传值(传递的值作为函数的“位置参数”)
- 函数名 值1 值2 ... ...
8、中断和退出
- continue 可以结束单词循环
- break 可以结束循环体
- exit 可以退出脚本
9、字符串的处理与变量初始化
子串截取
- ${变量:起始位置:长度}
子串替换
- 替换一个结果 ${变量/旧字串/新字串}
- 替换全部结果 ${变量//旧字串/新字串}
替换后只是显示出来,但是phone的值没有改变
字串掐头
- 从左向右,最短匹配删除 ${变量#关键字}
- 从左向右,最长匹配删除 ${变量##关键字}
同样,对变量掐头不会改变变量原有的值
字串去尾
- 从右向左,最短匹配删除 ${变量%关键词}
- 从右向左,最长匹配删除 ${变量%%关键词}
同样,对变量去尾不会改变变量原有的值
10、变量初始化
语法格式 ${变量:-关键词}
变量有值,则返回该变量的值
变量无值,则返回初始值
11、随机密码
子串截取生产密码
使用命令生成随机密码
- uuidgen
- openssl
使用随机设备文件(/dev/random、/dev/urandom)
tr命令可以对数据进行替换、删除等操作
- -c 取反
- -d 删除
tr -d 'a-z' 删除字串中的a-z的部分
tr -cd 'a-z' 删除字串中不是'a-z'的部分
三、正则表达式
1、基本正则
正则表达式(Regular Expression):
- 描述一个字符集合的表达方式
- 模糊匹配
正则符号 | 描述 |
abc | 匹配abc |
^ | 匹配开头 |
$ | 匹配结尾 |
[集合] | 匹配集合中的任意单个字符 |
[^集合] | 对集合取反 |
. | 匹配任意单个字符 |
* | 匹配前一个字符任意次(包含0次) |
.* | 匹配任意 |
\{n,m\} | 匹配前一个字符n到m次 |
\{n,\} | 匹配前一个字符至少n次 |
\{n\} | 匹配前一个字符n次 |
2、扩展正则
正则符号 | 描述 |
+ | 匹配前面的字符至少1次 |
? | 匹配前面的字符0或1次 |
() | 组合与保留 |
| | 或者 |
{n,m} | 匹配前面的字符n到m次 |
{n,} | 匹配前面的字符至少n次 |
{n} | 匹配前面的字符n次 |
grep默认不支持扩展正则,使用时需添加-E的选项
3、Perl兼容的正则符号
正则符号 | 描述 |
\b | 匹配单词边界 |
\w | 匹配字符数字下划线 |
\W | 和\w相反 |
\s | 匹配空白 |
\d | 匹配数字 |
\d+ | 匹配多个数字 |
\D | 匹配非数字 |
grep默认不支持Perl正则,使用时需添加-P的选项
grep语法格式
- grep [选项] 匹配模式 [文件]...
常用选项:
- -i 忽略大小写
- -v 取反匹配
- -w 匹配单词
- -q 静默匹配,不将结果显示在屏幕
四、sed基础
1、什么是sed
Stream Editor:流式编辑器
- 非交互式
- 逐行处理
- 可以对文本进行增、删、改、查等操作
语法格式:
- sed [选项] '[定位符]指令' 文件名
- 命令 | sed [选项] '[定位符]指令'
常用命令选项:
- -n 屏蔽默认输出
- -i 直接修改源文件
- -r 支持扩展正则
2、数据定位
行号定位
正则定位:用正则匹配需要的数据,然后再编辑对应的内容
3、使用sed修改配置
常用sed指令:
- p 打印行
- d 删除行(不使用-i选项,源文件不会被修改)
- c 替换行(不使用-i选项,源文件不会被修改)
- s 替换关键词(c以行为单位替换,s以关键词为单位替换且替换符'/'可以用任意符号代替,)
- = 打印行号