zoukankan      html  css  js  c++  java
  • Shell总结


    一. Shell是什么?
    a)、Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器),它接收用户命令,然后调用相应的应用程序。
    b)、Shell还是一个功能相当强大的解释性编程语言,易编写、易调试、灵活性强。
    1.语言类型:
    1.)编辑型语言
    程序在执行之前需要一个专门的编译过程,八程序编译成为机器语言文件,运行是不需要重新翻译,直接使用编译结果就型了。程序执行效率高,依赖编译器,跨平台性差点。如 C ,C++
    2.)解释型语言
    程序不需要编译,程序运行时由解释器编译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/JavaScript/perI/ruby/Shell等都是解释型语言
    3.)Shell解析器:
    bash也就是 Bourne Again Shell,由于易用和免费,bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

    二、Shell的作用
    1.Shell脚本:
    若干命令+脚本的基本格式+脚本特定语法+思想= shell脚本,脚本按照顺序执行(由上往下执行),它是解释型的,不需要编译。
    使用场景:
    重复化、复杂化的工作,可以写成脚本,以后只需要执行脚本就可以完成这些工作
    1.)Shell脚本能干啥?
    自动化软件部署
    自动化分析处理
    自动化备份
    自动化监控脚本

    2.脚本的用法
    2.1)脚本的格式:
    part1:第一行指定解析器:脚本以#!/bin/bash 或 #!/bin/env bash开头
    part2: 第二行开始编写脚本的基本信息描述
    part3:脚本的具体代码内容
    2.2)运行方式
    case1:采用bash或sh + 脚本的相对路径或绝对路径(不用赋予脚本+x权限)
    sh/bash 绝对路径|相对路径
    source 绝对路径|相对路径
    case2:采用输入脚本的绝对路径或相对路径执行脚本(hi奥本必须有可执行权限+x,推荐采用这种方式)
    赋予脚本的+x权限 chmod +x 脚本名称 运行:./脚本名称
    如果需要在任意地方执行脚本,需要将脚本移动至/bin目录 运行:脚本名称

    3.Shell变量
    shell的作用:变量是用来临时保存数据的,该数据是可以变化的
    什么时候用?
    3.1)多次使用,在代码中重复出现,这样在修改内容的时候,仅仅需要修改变量的值。
    3.2)代码运作的过程中,后续代码需要使用某些命令的执行结果,可以使用变量保存执行结果。
    获取Shell中所有变量命令:set
    获取环境变量:env
    系统变量:
    $HOME、$PWD、$SHELL、$USER
    读取变量:echo $变量名

    4.自定义变量
    4.1)用户变量
    定义变量:变量名=值,变量名=`执行命令`,变量名=$(执行命令)
    读取变量:echo $变量名
    撤销变量:unset 变量名
    定义有类型的变量:
    给变量做一些限制,固定变量的类型
    语法:declare 选项 变量名=变量值
    常用选项: -i 将变量看作整数 , -r 创建只读变量
    4.2)全局环境变量
    关键字:expor
    定义变量:export 变量名=值
    撤销和读取同
    作用域(针对于当前会话下的所有用户有效)
    4.3)系统环境变量
    编辑配置文件:vim /etc/profile
    例如添加系统环境变量 MYNAME=jinghang
    变量生效 source /etc/profile
    #系统环境变量
    export MYNAME=jinghang
    经验技巧:
    (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
    (2)等号两侧不能有空格
    (3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
    (4)变量的值如果有空格,需要使用双引号或单引号括起来。

    4.4)特殊变量
    $n 语法:$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
    $# 语法:$# (功能描述:获取所有输入参数个数,常用于循环)
    $* 语法:$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
    $@ 语法:$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
    $? 语法:$? (功能描述:最后一次执行命令的返回状态。如果值为0,命令正确执行;如果值为非0(具体是哪个数,由命令自己来决定),则命令执行不正确)

    三.Shell数组
    shell定义:Shell 数组用括号来表示,元素用"空格"符号分割开,如果元素中包含空格,则该元素使用双引号引起来,例如"hello word"
    语法: 数组名=(value1 value2 value3)
    赋值:创建时添加 my_array=(A B "C B" D) 创建后添加 my_array[4]=E
    修改:局部:根据索引修改数组 my_array[0]=F
    整体:可以直接给数组变量重新赋值
    读取:获取数组中所有的元素:echo ${数组名[*]} | echo ${数组名[@]}
    根据索引读取数组元素:echo ${数组名[索引值]}
    获取数据组的长度:echo ${#数组名[*]} | echo ${#数组名[@]}
    删除:unset 关键字来删除数组元素,格式如下:unset array_name[index]不写下标,删除整个数组,格式如下:unset array_name

    四.Shell中的运算符
    1.整数运算语法:
    (1)“$((运算式))”或“$[运算式]” + , - , *, /, % 加,减,乘,除,取余
    (2)expr + , - , *, /, % 加,减,乘,除,取余
    2.小数运算:
    bc:Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器
    在 Shell 脚本中,借助管道或者输入重定向来使用 bc 计算器。
    语法:echo "scale=小数位数 ; expression" | bc
    案例1:计算3*8/7 结果保留4位小数 echo "scale=4; 3*8/7" | bc

    五.Shell条件判断
    语法:[ condition ](注意condition前后要有空格)
    (1)两个整数之间比较
    == 字符串比较
    -lt 小于(less than)
    -le 小于等于(less equal)
    -eq 等于(equal)
    -gt 大于(greater than)
    -ge 大于等于(greater equal)
    -ne 不等于(Not equal)
    (2)按照文件权限进行判断
    -r 有读的权限(read)
    -w 有写的权限(write)
    -x 有执行的权限(execute)
    (3)按照文件类型进行判断
    -f 文件存在并且是一个常规的文件(file)
    -e 文件存在(existence)
    -d 文件存在并是一个目录(directory)

    六.Shell流程控制
    1.)if 判断语句
    语法1: if [ 条件判断式 ]
    then
    主体代码
    fi
    语法2: if [ 条件判断式 ]
    then
    主体代码
    else
    主体代码
    fi
    语法3: if [ 条件判断式 ]
    then
    主体代码
    elif [条件判断式]
    then
    主体代码
    else
    主体代码
    fi
    注意事项:
    (1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
    (2)if后要有空格
    2.)case 判断语句
    case $变量名 in
    "值1")
    如果变量的值等于值1,则执行程序1
    ;;
    "值2")
    如果变量的值等于值2,则执行程序2
    ;;
    …省略其他分支…
    *)
    如果变量的值都不是以上的值,则执行此程序
    ;;
    esac
    注意事项:
    1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
    2)双分号“;;”表示命令序列结束,相当于java中的break。
    3)最后的“*)”表示默认模式,相当于java中的default。
    3.)for 循环语句
    基本语法:
    语法一
    for (( 初始值;循环控制条件;变量变化 ))
    do
    程序
    done
    语法二
    $*:读取传入脚本中的全部参数,把参数看作一个整体
    $@:读取传入脚本中的全部参数,把参数区分对待
    for 变量 in "$*"
    do
    程序
    done

    for 变量 in "$@"
    do
    程序
    done
    4.)while 循环语句
    基本语法
    while [ 条件判断式 ]
    do
    程序
    done

    read读取控制台输入
    基本语法:read 【选项】【参数】
    功能:-p 指定读取值时的提示符;
    -t 指定读取值时等待的时间(秒);

    七.Shell函数
    1.)系统函数
    basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来
    语法:basename [string / pathname] [suffix]
    可选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
    dirname 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
    语法:dirname 文件绝对路径
    2.)自定义函数
    语法:[ function ] funname()
    {
    Action;
    [return int;]
    }
    funname
    经验技巧:
    (1)必须在调用函数地方之前,先声明函数,shell脚本逐行运行。不会先编译。
    (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

    八.Shell文本处理
    1.)cut : 功能描述:cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的,cut指令用户显示行中的指定部分,删除文件中的指定字段。
    语法:cut 【选项】【文件】
    选项功能:
    -b <起始字节位置-结束字节位置> 仅显示行中指定字节范围的内容。例如,“-b 2-10”将显示第2~10个字节位置的内容,当只有一个数字时,则仅显示指定字符位置的内容.
    -f <起始列位置-结束列位置> 显示指定的字段内容
    -d <分隔符>指定字段的分隔符,默认的字段分隔符为“TAB”
    -c <起始字符位置-结束字符位置> 仅显示行中指定范围的字符。例如,“b2-10” 将显示第2~10个字符位置的内容。当只有一个数字时,则仅显示指定字符位置的内容
    2.)sort : 功能描述:它将文件进行排序,并将排序结果标准输出
    语法:sort 【选项】【参数】
    选项功能:
    -n 依照数值的大小排序
    -r 以相反的顺序来排序
    -t 设置排序时所用的分隔字符
    -k 指定需要排序的列
    参数:是指待排序的文件
    3.)正则表达式:正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本
    3.1)单字符匹配:
    d 匹配一个数字字符。等价于[0-9]
    D 匹配一个非数字字符。等价于[^0-9]
    w 匹配包括下划线的任何单词字符。类似但不等价于[A-Za-z0-9_]
    W 匹配任何非单词字符。等价于 [^A-Za-z0-9_]
    s 匹配空白字符,包括空格、制表符、换页符等等,等价于[f v]
    S 匹配任何可见字符。等价于[^ f v]
    .点 匹配除“ ”和" "之外的任何单个字符
    [a-z] 字符范围,匹配a~z之间的任意字符
    [^a-z] 匹配除了a~z之间的其他字符
    匹配换行符
    3.2)多字符匹配
    + 匹配前面的子表达式一次或多次(大于等于1次)
    * 匹配前面的子表达式任意次
    ? 匹配前面的子表达式零次或一次
    {n} n是一个非负整数。匹配确定的n次
    {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次
    3.3)其他
    ^ 匹配输入字行首
    $ 匹配输入行尾
    | 将两个匹配条件进行逻辑“或”(or)运算 x|y 匹配x或y
    4.)sed: 功能描述:sed是一种单行文本流式编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件结束。文件内容并没有改变,除非你使用重定向存储输出。
    语法:sed [选项] ’命令‘ 文件名
    选项功能:
    -e 直接在指令列模式上进行sed的动作编辑(一次执行多个操作时)。
    -i 直接编辑文件
    命令功能
    p 打印一般 -n 配合使用
    a 新增,在指定的行之后插入内容
    i 新增,在指定的行之前插入内容
    d 删除
    s 查找并替换 (注意:如果进行全局的查找替换 sed -i ‘s/查找条件/替换字符串/g’ global)
    5.)awk:功能描述:是一门编程语言,也是一个强大的文本分析工具,逐行扫描文件,默认从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要的操作。
    语法:awk 选项 ‘pattern1{action1} pattern2{action2}...’ 文件名
    pattern:表示AWK在数据中查找的内容,就是匹配模式
    action:在找到匹配内容时所执行的一系列命令
    选项功能:
    -F 指定输入文件折分隔符
    -v 赋值一个用户定义变量
    awk的内置变量:
    变量说明:
    FILENAME 文件名
    NR 已读的记录数
    NF 浏览记录的域的个数(切割后,列的个数)

  • 相关阅读:
    HDU3145 Max Sum of Max-K-sub-sequence (单调队列模板)
    AcWing1088 旅行问题(单调队列)
    POJ1821 Fence(单调队列)
    POJ1742 Coins(多重背包+二进制优化)
    AcWing217 绿豆蛙的归宿(期望)
    BZOJ.2134.[国家集训队]单选错位(概率 递推)
    洛谷.3805.[模板]manacher算法
    Codeforces.280C.Game on Tree(期望)
    BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)
    洛谷.4172.[WC2006]水管局长(LCT Kruskal)
  • 原文地址:https://www.cnblogs.com/Qin125/p/13399798.html
Copyright © 2011-2022 走看看