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

重定向类型

image
image

shell变量

  • 基本格式

    • 添加变量:变量名 = 值
    • 引用变量值:$变量名
    • 查看变量值:echo $变量名、echo $
    • 取消变量:unset 变量名(可以使用空格分开)
  • 变量类型
    image

  • 环境变量

    • 配置文件
      • /etc/profile(对所有的用户)、~/.bash_profile(当前用户下)
    • 相关操作
      • env : 列出所有的环境变量(包括值)
      • set : 列出所有的变量
    • 常用的环境变量
      • SHELL、USER等
  • 位置变量

    • 在执行脚本时提供的命令行参数
      • 表示为$n,n为序列号
      • image
  • 预定义变量

    • 用来保存脚本程序的执行信息
      • 直接使用这些变量
      • 不能直接为这些变量赋值
    • image

字符串变量值

  • 双引号与单引号
    • 双引号(有空格的时候不能省略)
      • 允许$扩展,可调用其他变量的值
      • 出现特殊字符时,可采用\符号转义
      • 当变量值不包括空格、制表符时、双引号通常被省略
    • 单引号
      • 所有字符均视为该字符本身(无特殊含义)
      • 不允许转义

发布全局变量

  • 表达式
    • 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的值不会变

例子如下

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命令和$[]表达式 不支持有小数的运算
      image
  • 使用bc计算器

    • 多数Linux系统默认安装此工具

      • 支持高精度的数值运算
      • 直接运行bc可进入交互运算界面,quit退出
      • 设计scale=n可约束小数位
    • image

    • 结合管道向bc发送表达式

      • 多个表达式以分号分隔
      • 通过echo命令+管道传递要计算的表达式
    • image

    • 小数值比较

      • image

字符串处理

截取

  • 使用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(有-)

例子

image

  • 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
  • 比较整数数值(不是大于号小于号等于号进行判断,因为这些都有特殊意义)

image

  • 字符串比较

    • 基本用法
      • [字符串1 选项 字符串2]
      • [选线 字符串]
    • image
  • 将条件取反

    • 使用!操作符号
      • [! 测试条件]

条件分支

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
    • 缺点

      • image
    • 解决缺点方式

      • 先排序后去重
        • image
  • 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{}(相当于每一行的值)
    • 在目标命令中可以嵌入{}引用

例子

image

xargs获取值列表

  • 结合选项-d指定分隔

例子

image

expect预期交互控制

  • 手动交互
    • 直接运行expect命令
    • 进入交互式指令测试环境
  • 自动交互

awk命令

  • 语法格式
    • 格式1:前置命令 | awk [选项] '[条件]{编辑命令}'
    • 格式2:awk [选项] '[条件]{编辑命令}' 文件... (如果命令有多条,可以使用分号分隔)
  • 常用命令选项
    • -F:指定分隔符,可省略(默认空格或着tab位)
    • -f:调用awk脚本进行处理

例子

image

  • 内置变量

image

例子

image

  • awk处理时机

    • 处理前,BEGIN{}

      • 读入第一行文本之前执行
      • 一般用来初始化操作
    • 逐行处理,{}

      • 逐行读入文本执行相应的处理
    • END{}

      • 处理完最后一行文本之后执行

例子

image

  • awk处理条件

    • 条件表示形式
      • 正则表达式

        • /正则表达式/
        • 匹配,!不匹配
        • image
      • 数值/字符串比较

        • ==等于、!=不等于
        • >大于,>= 大于或等于
      • 逻辑比较

        • && 逻辑与
        • || 逻辑或
        • image
      • 运算符

        • 加减乘除,取模
        • 自增、自减
        • image
  • awk分支流程

    • 单分支
      • if(条件)
    • 双分支
      • if(条件){编辑指令}else
    • 多分支
      • if(条件){编辑指令}else if{编辑指令} else
    • image
  • while循环结构

    • while(条件)
    • do{编辑指令}while(条件)
    • image
  • for循环
    -image

  • 流程控制

    • image

    • image

sed(文本处理,通过是用命令的方式编辑文本)

  • 主要用法
    • 格式1:前置命令|sed [选项] '编辑指令'
    • 格式2:sed [选项] '编辑指令' 文件
      • 编辑指令:[定址符]处理动作
        • 定支付:[地址1,地址2]

image

  • 常见命令选项
    • -n:屏蔽默认输出(全部文本)
    • -i:直接修改文件内容
    • -f:使用sed脚本
    • -e:可指定多个处理动作
    • -r:启动扩展的正则表达式,若与其他选项一起使用,应用为首个选项
    • {}:可组合多个命令,以分号分隔
  • 处理动作

image

  • 输出文本

image

  • 删除文本

image

  • 替换文本

image

sed文本块处理

  • 处理动作

image

sed导入导出

image

例子

image

本次笔记是学习下面学习视频的笔记:如果觉得侵犯了,麻烦说明下,我很乖的

https://www.bilibili.com/video/BV1sq4y1K7nM?p=19&spm_id_from=pageDriver

posted @ 2021-10-09 00:05  Myuniverse  阅读(129)  评论(0编辑  收藏  举报