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以关键词为单位替换且替换符'/'可以用任意符号代替,)



- = 打印行号


浙公网安备 33010602011771号