day3
运行脚本方式
脚本内容如下:
#!/bin/bash
# 创建用户账号
useradd yangshimiao
# 将用户登录密码设置为ysm@121388
passwd yangshimiao
第一种方法:
- sh 代码文件路径 === bash 代码文件路径
第二种方法:
- 为shell代码文件添加x权限
- . 代码文件路径 === source 代码文件路径
调试shell脚本
- 直接观察执行过程
- 执行中的命令输出、报错信息
- 与用户的交互
- 开启调试模式
- sh -x 脚本文件
- 插入echo断点
- echo '提示信息'
- 在脚本文件中使用set -x开启调试,使用set +x关闭调试
#!/bin/bash
set -x # 开启调试
# 创建用户账号
useradd yangshimiao
# 将用户登录密码设置为ysm@121388
passwd yangshimiao
set +x # 关闭调试
忽略命令无关输出
-
设备黑洞 /dev/null
- 相当于只能写入,不能读出的单向文件
- 存放到其中的数据都会丢失
- 用法:可执行语句 &> /dev/null>
echo 12345678 | passwd --stdin yangshimiao &> /dev/null # 忽略输出内容
记录错误输出
- 根据需要,可以将出错信息保存指定文件
- 用法:可执行语句 2> /路径/文件
命令组合运用
-
使用分号
- 命令1;命令2;命令3
- 一次执行,只有先后顺序、没有逻辑关系
-
使用&&
- 命令1&&命令2&&...
- 逻辑关系为"而且",期望所有的命令都能够符合预期
- 一旦出现失败,后续命令不在执行
-
使用||
-
命令1||命令2||命令3||...
-
逻辑关系为或者,任何一条命令成功都符合预期
-
只在前面的命令失败,后续命令才会继续执行
-
典型应用:
-
id yangshimiao || useradd yangshimiao # 如果没有yangshimiao这个用户,则创建
-
-
-
组合逻辑分隔(没有优先级,只有顺序之分)
- 例子
命令1&&命令2||命令3
当命令1执行成功时,会继续执行命令2(忽略命令3)
当命令1执行失败时,会继续执行命令3(放弃命令2)
id yangshimiao &> /dev/null && echo yes || echo no # 如果yangshimia这个用户存在则输出yes,否则输出no
标准输入和输出
- 标准输入:从此设备接收用户输入的数据
- 标准输出: 通过此设备向用户报告正常的命令输出结果
- 标准错误:通过此设备报告执行中的出错信息
类型 | 设备文件 | 文件描述符 |
---|---|---|
标准输入 | /dev/stdin | 0 |
标准输出 | /dev/stdout | 1 |
标准错误输出 | /dev/stderr | 2 |
重定向类型
shell变量
-
基本格式
- 添加变量:变量名 = 值
- 引用变量值:$变量名
- 查看变量值:echo $变量名、echo $
- 取消变量:unset 变量名(可以使用空格分开)
-
变量类型
-
环境变量
- 配置文件
- /etc/profile(对所有的用户)、~/.bash_profile(当前用户下)
- 相关操作
- env : 列出所有的环境变量(包括值)
- set : 列出所有的变量
- 常用的环境变量
- SHELL、USER等
- 配置文件
-
位置变量
- 在执行脚本时提供的命令行参数
- 表示为$n,n为序列号
- 在执行脚本时提供的命令行参数
-
预定义变量
- 用来保存脚本程序的执行信息
- 直接使用这些变量
- 不能直接为这些变量赋值
- 用来保存脚本程序的执行信息
字符串变量值
- 双引号与单引号
- 双引号(有空格的时候不能省略)
- 允许$扩展,可调用其他变量的值
- 出现特殊字符时,可采用\符号转义
- 当变量值不包括空格、制表符时、双引号通常被省略
- 单引号
- 所有字符均视为该字符本身(无特殊含义)
- 不允许转义
- 双引号(有空格的时候不能省略)
发布全局变量
- 表达式
- export 变量名 = 值
read命令取值用法
- 基本格式
- read 变量名
- read -p "提示信息" 变量名
- read -s -p "提示信息" 变量名 (密码的输入就是使用这个命令)
root@iZwz9e9igexgtzexjocyw7Z:~/shell# read -p "please enter your name:" your_name
please enter your nameyangshimiao
root@iZwz9e9igexgtzexjocyw7Z:~/shell# echo $your_name
yangshimiao
root@iZwz9e9igexgtzexjocyw7Z:~/shell# read -s -p "please enter your name:" your_name
please enter your name:
root@iZwz9e9igexgtzexjocyw7Z:~/shell# echo $your_name
kkkk
基本运算
- 使用expr命令工具
- 格式:expr 整数1 运算符 整数2(记得数字和符号之间是有空格)
- 乘法操作应采用\*转义,避免被作为Shell通配符
- 计算结果直接显示在屏幕上
例子如下:
x=48;y=21
expr $x + $y
expr $x / $y
expr $x \* $y
- 使用$[]表达式
- 格式:$[整数1 运算符 整数2...]
- 乘法不需要转义,运算符两侧可以空格,引用变量可省略$符号
- 计算结果替换表达式本身,结合echo命令才能显示到屏幕上
- 表达式还支持乘方运算:**
例子如下
x=48;y=21
echo $[x/y]
echo $[x*y]
echo $[10**3]
- 自增处理
- 格式:变量运算符=值
- ++i与i++的区别
- ++i
- 先运算
- 后取值,i的值会改变
- i--
- 先取值
- 后运算,i的值不会变
- ++i
例子如下
x=48
echo $[x+=2] # 50
echo $x # 50
echo $[++x] # 51
echo $x # 51
- 使用let命令操作变量
- 操作变量运算,并保存新结果。也就是不受i++和++i的影响
例子
x=48;y=21
let x++,y/=3
echo $x,$y
# 49,7
随机数
- 在/bin/bash环境可直接使用RANDOM,每次被调用时,随机生成0~32767之间的的一个整数
例子
echo $RANDOM
# 2940
echo $RANDOM
# 9402
echo $RANDOM
# 12387
- 变化随机数范围
- 范围扩大可以相乘:echo $[RANDOM*RANDOM]
- 范围缩小可以取模:echo $[RANDOM%100]
使用seq命令
- 根据指定条件输出一组整数
- 默认从整数1开始
- 缺省的增量步长也是1
- 默认分隔符为换行
例子
seq 1 6
1
2
3
4
5
6
- seq的命令格式
- seq 末数
- seq 首数 末数
- seq 首数 步长 末数
例子(-s 可以改变分隔符 -w 可以显示等宽的数值)
seq -s ' ' 10
# 1 2 3 4 5 6 7 8 9 10
seq -s ' ' 1 10
# 1 2 3 4 5 6 7 8 9 10
seq 1 5 10
# 1 5 10
数值运算的局限性
-
bash内建机制仅支持整数运算
- expr命令和$[]表达式 不支持有小数的运算
- expr命令和$[]表达式 不支持有小数的运算
-
使用bc计算器
-
多数Linux系统默认安装此工具
- 支持高精度的数值运算
- 直接运行bc可进入交互运算界面,quit退出
- 设计scale=n可约束小数位
-
结合管道向bc发送表达式
- 多个表达式以分号分隔
- 通过echo命令+管道传递要计算的表达式
-
小数值比较
-
字符串处理
截取
- 使用expr命令(从开始)
- 基本用法
- expr substr $var2 起始位置 截取长度
- 基本用法
- 使用cut命令(从1开始)
- 命令输出 | cut -c 起始位置-结束位置
- 输出命令 | cut -d '分隔符' -f 字段编号(从1开始)
例子
var="CenterOS6.5"
echo $var1 | cut -c 5-6
# OS
echo $var1 | cut -c -6 # 简写从零开始
CentOS
echo $var1 | cut -d "t" -f2 # 使用t进行分隔
OS6.5
- 使用${}表达式
- 基本用法
- $
- $
- 基本用法
例子
var1="CentOS6.5"
echo ${var1:1:4}
# entO
echo ${var1::4} # mac不能使用
# Cent
echo ${var1:6:3}
# 6.5
替换
- 使用${}表达式(只能连续)
- ${var1/old/new}只替换一个
- ${var1//old/new}替换所有
例子
var1="CentOS6.5Server"
echo ${var1/CentOS/yes}
# yes6.5Server
echo ${var1//e/o}
# ContOS6.5Sorvor
- 使用tr单字替换工具
- 基本用法
- 命令输出 | tr 'abc' 'ABC'
- 命令输出 | tr -d 'abc' ,删除abc单个字符
- 基本用法
例子
head -1 /etc/passwd | tr 'or' 'OR'
# ROOT:x:O:O:ROOt:/bin/bash
路径处理
- 文件路径 /etc/passwd的含义
- 文件所在位置:/etc
- 文件名称:passwd
- dirname取目录位置
- 基本用法
- dirname 字符串
- 基本用法
- basename取基本名称
- 基本用法
- basename 字符串
- 基本用法
例子
dirname "/etc/passwd"
# /etc
basename "/etc/passwd"
# passwd
使用随机字符串
- 随机设备或工具
- 常见的随机工具
- 随机数变量:RANDOM
- 特殊设备文件:/dev/urandom(会有乱码)
- UUID生成命令:uuidgen(有-)
- 常见的随机工具
例子
- md5sum校验工具,只会生成数值和字母的字符串,但是mac不支持
- 根据输入文本计算出256位的md5编码值
- 输入文本有任何差异,编码结果都会不同步
例子
echo $RANDOME | md5sum
# 1badd736
多条命令嵌套使用
- 使用$(命令)
- 使用``
条件
- 返回状态值$?(不受&>/dev/null影响)
- 判断前一条命令是否执行成功(成功意思:能够输出预期结果)
- 查看$?的值,如果为0,表示前一条命令执行成功
- 如果$?的值为1或者其他数值,表示前一条命令失败异常
- 判断前一条命令是否执行成功(成功意思:能够输出预期结果)
例子
ls -ld /root &>/dev/null;echo $?
# 0
ls -ld /rootx &>/dev/null;echo $?
# 2
- 检查文件是否存在的方法
- [-f /etc/hosts]如果是普通文件则返回0,如果不是返回1。但是这种方式在mac的命令行中不适配。命令行中将中括号替换为test
- 比较整数数值(不是大于号小于号等于号进行判断,因为这些都有特殊意义)
-
字符串比较
- 基本用法
- [字符串1 选项 字符串2]
- [选线 字符串]
- 基本用法
-
将条件取反
- 使用!操作符号
- [! 测试条件]
- 使用!操作符号
条件分支
if 条件测试1 then
命令序列
elif 条件测试2 then
命令序列
eles
命令序列
fi
流程控制
for
for 变量名 in 值列表
do
命令序列
done
## 例如
List=[]
for username in $List
do
echo username
done
while
while 条件测试
do
命令 序列
done
######
a=0
while [!a eg 10]
do
echo a
a+=1
done
中断或跳过当前循环
- continue
- break
退出控制
- 退出整个shell脚本,并返回状态值
- exit
shell函数
- 基本格式
function 函数名{
命令序列
}
- 调用已定义的函数
- 格式:函数名
- 先定义了才能调用,就好比脚本的内部命令
- 函数传值
- 格式:函数名 值1 值2
- 传递的值作为函数的位置参数
case分支
case 变量值 in
模式1)
命令序列;;
模式2)
命令序号;;
*)
默认命令序列
esac
标准的系统服务管理(不适用与mac)
这里放置蓝牙开光、网络开关等服务
- 查看服务列表,自启状态
- chkconfig --list [服务名]
- chkconfig 服务名 on|off
- 启动/停止/重启服务
- service 服务名 start|stop|restart
- /etc/init.d/服务名 start|stop|restart
文件排序及统计
-
ls列表的顺序
- 默认按字母升序排列
- --S:按文档大小降序排列
- --t:按文档修改时间降序排列
- --r:反序排列
- 默认按字母升序排列
-
uniq去重工具(优缺点,只能将连续的字符串进行删除)
-
基本用法
- 用法1: uniq 文件
- 用法2: 命令|uniq
-
缺点
-
解决缺点方式
- 先排序后去重
- 先排序后去重
-
-
sort排序工具
- 基本用法
- 用法1:sort 文件
- 用法2:命令|sort
- 常用命令选项
- --u:去除重复行
- --n:按数字顺序升序排列
- --r:反向排序
- --k:优先对第几列的内容排序
- 基本用法
反序输出文本行
- tac命令工具(mac不支持)
- 以行为单位反序,与cat命令显示效果相反
- rev命令工具
- 以字符为单位反序,与echo命令效果相反
命令输出的局限性
- 标准输出、管道
- 只在当前终端上显示
- 无法保存结果
- 重定向输出操作
- 只保存到指定文件
- 无法显示结果
tee整合重定向(mac中没有)
- 作用:即显示结果,也保存结果
- 典型用法
- 命令 | tee 文件
unix2dos与dos2unix转换
- unix2dos表示linux转化为win;dos2unix表示win转化为Linux
xargs工具及应用
- 根据给定的参数组(以行为单位)分次执行目标命令行
- 用法1:提供参数的命令 | xargs 目标命令
- 用法2:xargs --arg-file=提供参数的文件 目标命令行
例子
find / | xargs ls -lh
xargs处理参数调用
- 文件改名、复制等操作
- 选项-I定义标记,比如-I{}(相当于每一行的值)
- 在目标命令中可以嵌入{}引用
例子
xargs获取值列表
- 结合选项-d指定分隔
例子
expect预期交互控制
- 手动交互
- 直接运行expect命令
- 进入交互式指令测试环境
- 自动交互
awk命令
- 语法格式
- 格式1:前置命令 | awk [选项] '[条件]{编辑命令}'
- 格式2:awk [选项] '[条件]{编辑命令}' 文件... (如果命令有多条,可以使用分号分隔)
- 常用命令选项
- -F:指定分隔符,可省略(默认空格或着tab位)
- -f:调用awk脚本进行处理
例子
- 内置变量
例子
-
awk处理时机
-
处理前,BEGIN{}
- 读入第一行文本之前执行
- 一般用来初始化操作
-
逐行处理,{}
- 逐行读入文本执行相应的处理
-
END{}
- 处理完最后一行文本之后执行
-
例子
-
awk处理条件
- 条件表示形式
-
正则表达式
- /正则表达式/
- 匹配,!不匹配
-
数值/字符串比较
- ==等于、!=不等于
>
大于,>= 大于或等于
-
逻辑比较
- && 逻辑与
- || 逻辑或
-
运算符
- 加减乘除,取模
- 自增、自减
-
- 条件表示形式
-
awk分支流程
- 单分支
- if(条件)
- 双分支
- if(条件){编辑指令}else
- 多分支
- if(条件){编辑指令}else if{编辑指令} else
- 单分支
-
while循环结构
- while(条件)
- do{编辑指令}while(条件)
-
for循环
- -
流程控制
sed(文本处理,通过是用命令的方式编辑文本)
- 主要用法
- 格式1:前置命令|sed [选项] '编辑指令'
- 格式2:sed [选项] '编辑指令' 文件
- 编辑指令:[定址符]处理动作
- 定支付:[地址1,地址2]
- 编辑指令:[定址符]处理动作
- 常见命令选项
- -n:屏蔽默认输出(全部文本)
- -i:直接修改文件内容
- -f:使用sed脚本
- -e:可指定多个处理动作
- -r:启动扩展的正则表达式,若与其他选项一起使用,应用为首个选项
- {}:可组合多个命令,以分号分隔
- 处理动作
- 输出文本
- 删除文本
- 替换文本
sed文本块处理
- 处理动作
sed导入导出
例子
本次笔记是学习下面学习视频的笔记:如果觉得侵犯了,麻烦说明下,我很乖的
https://www.bilibili.com/video/BV1sq4y1K7nM?p=19&spm_id_from=pageDriver