zoukankan      html  css  js  c++  java
  • 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:起始位置:截取长度}
        • ${var1:截取长度}

    例子

    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

  • 相关阅读:
    D3D中的粒子系统(1)
    半角/全角的转换算法
    对Native API NtSystemDebugControl的分析
    教你快速下载fs2you.com网盘的文件
    养眼的编辑器配色
    Direct3D中的绘制(2)
    在服务里面弹出一个窗口到用户的桌面上[转]
    驱动级隐藏文件,注册表,进程
    GB2312转unicode程序
    Direct3D中的绘制(5)
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/15383506.html
Copyright © 2011-2022 走看看