• SHELL理论部分


    一、学习线路如下

    image


    二、变量

    1.变量的概念

    变量(variable)就是给某个信息片段所起的名字。每个变量都有一个值(value),这是由你分配给变量的内容或信息。变量值可以是空值,也就是不含任何字符。

    2.变量的命名

    SHELL变量名称的开头是一个字母互或下划线符号,后面可以接着任意长度的字母、数字或下划线符号。变量名称的字符长度并无限制。Shell变量可用来保存字符串值,所能保存的字符数同样没有限制。

    3.变量的赋值方式

    先写变量名称,紧接着'='字符,最后是新值,中间完全没有任何空格。当你想取出Shell变量的值时,需于变量名称前面加上'$'字符。当所赋值的值内含空格时,请加上引号。

    4.变量分类

    1.本地变量-临时变量
         用户自定义的变量,定义在脚本或者当前终端中,脚本执行完毕或终端结束变量失败。
    2.环境变量-用户私有变量
         定义在用户家目录下的.bashrc或.bash_profile文件中,用户私有变量,只能本用户使用。
         查看当前用户的环境变量env
         查看当前用户的所有变量(临时变量与环境变量)set
         将当前变量变成环境变量export
    3.全局变量
         所有用户都能够使用,export声明变量。
         也可以在/etc/profile /etc/bashrc下永久定义
    4.内置变量
         系统变量(内置bash中的变量)shell本身已经固定好了它的名字和作用。


    三、文本处理的命令

    cut整数截取
    语法:
        command|cut option
            -c: 以字符为单位进行分割。
            -d: 自定义分隔符,默认为制表符。	
            -f: 与-d一起使用,指定显示哪个区域。
    例:cat /etc/passwd|cut -d ":" -f1,7
    
    tr 字符转换:替换,删除
    语法:
        commands|tr 'string1' 'string2'
        tr 'string1' 'string2' < filename
        tr options 'string1' < filename
            -d 删除字符串1中所有输入字符。
            -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
                a-z 任意小写
                A-Z 任意大写
                0-9 任意数字
    
    sort排序
    sort:将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输
    出。
        -u :去除重复行
        -r :降序排列,默认是升序
        -o : 将排序结果输出到文件中 类似 重定向符号>
        -n :以数字排序,默认是按字符排序
        -t :分隔符
        -k :第N列
        -b :忽略前导空格。
        -R :随机排序,每次运行的结果均不同。
        
    uniq 去除连续的重复行
        -i: 忽略大小写
        -c: 统计重复行次数
        -d:只显示重复行
    
    tee 双向输出
        -a 双向追加重定向
        例:echo 999|tee -a file1
        
    paste工具用于合并文件行输出到屏幕,不会改动源文件
        -d:自定义间隔符,默认是tab,只接受一个字符
        -s:将每个文件中的所有内容按照一行输出,文件中的行与行以TAB间隔。
        
    echo输出
    语法:echo [-ne][字符串]
        -n 不要在最后自动换行
        -e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
        转义字符
            a 发出警告声;
             删除前一个字符;
            c 最后不加上换行符号;
            f 换行但光标仍旧停留在原来的位置;
            
     换行且光标移至行首;
            
     光标移至行首,但不换行;
            	 插入tab;
            v 与f相同;
             插入字符;
            nnn 打印nnn(八进制)所代表的ASCII字符; 备注:数字0 不要理解成字母o
            xNN 打印NN(十六进制)所代表的ASCII字符;
            
    输出字体颜色
        echo -e “033[30m 黑色字 033[0m”
      echo -e “033[31m 红色字 033[0m”
      echo -e “033[32m 绿色字 033[0m”
      echo -e “033[33m 黄色字 033[0m”
      echo -e “033[34m 蓝色字 033[0m”
      echo -e “033[35m 紫色字 033[0m”
      echo -e “033[36m 天蓝字 033[0m”
      echo -e “033[37m 白色字 033[0m”
    
    read默认接受键盘的输入,回车符代表输入结束
    OPTIONS:
        -p打印信息
        -t限定时间
        -s不回显
        -n输入字符个数


    四、SHELL字符

    !:             执行历史命令 !! 执行上一条命令
    $:             变量中取内容符
    + - *  %:     对应数学运算 加 减 乘 除 取余数
    &:             后台执行
    ;:         分号可以在shell中一行执行多个命令,命令之间用分号分割
    :             转义字符
    ``:         反引号 命令中执行命令 echo "today is `date +%F`"
    ' ':         单引号,脚本中字符串要用单引号引起来,但是不同于双引号的是,单引号不
    解释变量
        " ":     双引号,脚本中出现的字符串可以用双引号引起来
    通配符
        ~:         家目录 # cd ~ 代表进入⽤用户家目录
        *:         星号是shell中的通配符 匹配所有
        ?:         问号是shell中的通配符 匹配除回车以外的一个字符
        [list]: 匹配[list]中的任意单个字符
        [!list]: 匹配除list中的任意单个字符
        {string1,string2,...}: 匹配string1,string2或更多字符串
    重定向
        > 覆盖输入
        >> 追加输入
        < 输出
        << 追加输出
    管道命令
        |: 管道符 上一个命令的输出作为下一个命令的输入


    五、正则表达式

    1.正则的介绍:
         正则表达式(Regular Expression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。

    2.正则表达式中相应符号的解释

    1)定位符
        ^        锚定开头 ^a 以a开头 默认锚定一个字符
        $        锚定结尾 a$ 以a结尾 默认锚定一个字符
        <,:    锚定单词首部
        >,:    锚定单词尾部
    
    2)匹配符
        .        匹配除回车以外的任意一个字符
        ()        字符串分组
        []        定义字符类,匹配括号中的一个字符
        [^]        表示否定括号中出现字符类中的字符,取反
                转义字符
        |3)限定符
        *        某个字符之后加星号表示该字符不出现或出现多次
        ?        表示该字符出现一次或不出现
        +        表示该字符出现一次或多次
        {n,m}    某个字符之后出现,表示该字符最少出现n次,最多m次
        {m}        正好出现了m次

    3.正则表达式POSIX字符

    [:alnum:] 匹配任意字母字符0-9 a-z A-Z
    [:alpha:] 匹配任意字母,大写或小写
    [:digit:] 数字 0-9
    [:graph:] 非空字符( 非空格控制字符)
    [:lower:] 小写字符a-z
    [:upper:] 大写字符A-Z
    [:cntrl:] 控制字符
    [:print:] 非空字符( 包括空格)
    [:punct:] 标点符号
    [:blank:] 空格和TAB字符
    [:xdigit:] 16 进制数字
    [:space:] 所有空白字符( 新行、空格、制表符)


    六、数组

    1.生成数组
             数组名称=(元素1 元素2 元素3 ...)
    2.追加数组
             数组名称[n]=value
    3.一次赋多个值
             array=(var1 var2 var3 var4)
             array1=(`cat /etc/passwd`)
    4.数据取值
             ${array[i]} i表示元素的索引
             使用@ 或 * 可以获取数组中的所有元素:   
             echo ${array[0]}    获取第一个元素
             echo ${array[*]}     获取数组里的所有元素
             echo ${#array[*]}     获取数组里所有元素个数
             echo ${!array[@]}     获取数组元素的索引索引
             echo ${array[@]:1:2} 访问指定的元素;1代表从索引为1的元素开始获取;2代表获取后面几个元素
        
    5.关联数组
         1.声明关联数组
                 declare -A asso_array1
         2.赋值
                 asso_array1[linux]=one
         3.一次赋多个值
                 asso_array1=([name1]=harry [name2]=jack [name3]=amy


    七、if语句判断

    1.赋值运算
        =
    2.四则运算:
        + - * / % **
        运算命令:
            expr:
                例: expr 1 + 1
            let:
                例:let a=100/3echo a
            $(())
                例:echo $((1+1))
            bc
                例:echo "scale=2;3+1"|bc
    
    3.逻辑运算
        $$
        ||
        !
    
    4.比较运算
        -eq    等于
        -gt    大于
        -lt    小于
        -ge    大于等于
        -le    小于等于
        -ne    不等于
        
        字符串比较晕眩
            ==    等于
            !=    不等于
            -n    检查字符串的长度是否大于0
            -z    检查字符串的长度的是否为0
    
    5.文件类型及新旧判断
        -d 检查文件是否存在且为目录
        -e 检查文件是否存在
        -f 检查文件是否存在且为文件
        -r 检查文件是否存在且可读
        -s 检查文件是否存在且不为空
        -w 检查文件是否存在且可写
        -x 检查文件是否存在且可执行
        -O 检查文件是否存在并且被当前用户拥有
        -G 检查文件是否存在并且默认组为当前用户组
        file1 -nt file2 检查file1是否比file2新
        file1 -ot file2 检查file1是否比file2旧
        file1 -ef file2 检查file1是否与file2是同一个文件,判定依据的是i节点
    6.多重条件判断
        -a    和&&    同真为真
        -o    和||    任意满足一个则为真
        
    6.if高级用法
        if (())    可植入数学表达式
        if [[]]    可在条件中使用通配符


    八、循环语句

    1.for循环的格式
        for i in {1..10}    
        for i in 1 2 3 4
        for i in `seq 10`
        for ((expr1;expr2;expr3))
          do
            command
          done
          
    2.while循环的格式
        while [ 表达式 ]
        do
        command...
        done    
        
        注:"" or "True" 代表真
        
    3.case语句格式
        case $var in        #定义变量;var代表是变量名
        pattern 1)         #模式1;用 | 分割多个模式,相当于or   command1        #需要执行的语句   ;;           #两个分号代表命令结束
        pattern 2)   command2   ;;  *)         #default,不满足以上模式,默认执行*)下面的语句   command4   ;;
        esac                 #esac表示case语句结束
    
    4.until语句
        与while语法一致,until循环当条件为假时执行
        
    5.循环控制
        break    马上停止执行本次循环,执行循环体后面的代码
        continue    循环体内的下面代码不执行,重新开始下一次循环
        sleep        控制循环
        shift        位置参数像左移,默认移动一位
        exit        脚本退出命令

    九、SHELL函数

    1.shell函数的介绍
         shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能。
         将完成一个功能的一段代码进行命名、封装
         函数的优点:
             1. 代码模块化,调用方便,节省内存
             2. 代码模块化,代码量少,排错简单
             3. 代码模块化,可以改变代码的执行顺序
    2.函数定义
         语法一:
             函数名 () {
                 代码块
                 return N
             }
         语法二:
             function 函数名 {
                 代码块
                 return N
             }
         调用函数时直接输入函数名即可


    十、文本处理之grep

    grep: 负责从数据源中检索对应的字符串,行过滤。
    grep用于根据关键字进行行过滤
    grep options 'keys' filename
         OPTIONS:
             -i: 不区分大小写
             -v: 查找不包含指定内容的行,反向选择
             -w: 按单词搜索
             -n: 显示行号
             -A: 显示匹配行及后面多少行
             -B: 显示匹配行及前面多少行
             -o: 打印匹配关键字
             -c: 统计匹配到的次数
             -r: 逐层遍历目录查找
             -C: 显示匹配行前后多少行
             -l:只列出匹配的文件名
             -L:列出不匹配的文件名
             -e: 使用正则匹配
             -E:使用扩展正则匹配
             ^key:以关键字开头
             key$:以关键字结尾
             ^$:匹配空行
             --color=auto :可以将找到的关键词部分加上颜色的显示


    十一、文本处理之sed

    1.sed介绍
        sed是Linux中提供的一个外部命令,它是一个行(流)编辑器,编辑对象是文件中的行。
    2.sed语法
        sed [options]'{command}{flags}' [filename]
        命令选项:
            -e script 将脚本中指定的命令添加到处理输入时执行的命令中  多条件,一行中要有多个操作
            -f script 将文件中指定的命令添加到处理输入时执行的命令中
            -n     抑制自动输出
            -i     编辑文件内容
            -i.bak   修改时同时创建.bak备份文件。
            -r     使用扩展的正则表达式
            !     取反 (跟在模式条件后与shell有所区别)
        
        sed常用内部命令
            曾:a(在匹配后面添加) i(在匹配前面添加)
            删:d
            改:s(替换查找字符串) c(更改行)y(转换)
            查:p(打印)
        
        flags
            数字:    表示新文本替换的模式
            g:        表示用新文本替换现有文本的全部实例
            p:        表示打印原始的内容
            w filename:    将替换的结果写入文件

    十二、文本处理之awk

    1.awk介绍:
        awk是一种可以处理数据、产生格式化报表的语言。awk认为文件中的每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格活tab制表符
        awk的工作方式是读取数据,将每一行数据视为一条记录(record),每条记录以字段分隔符分为若干字段,然后输出各字段的值。
        
    2.awk语法
    awk [options] [BEGIN] {program} [END] [filename]
        常用命令选项:
            -F    fs    指定描绘一行中数据字段的文件分隔符,默认空格
            -f    file    指定读取程序的文件名
            -v val=value    定义awk程序中使用的变量和默认值
        awk程序运行优先级是:
            1)BEGIN:在开始处理数据流之间执行
            2)program:如何处理数据流,必选项
            3)END:处理完数据流后执行,可选项
            
    3.awk基本应用
    1)对字段(列)进行截取
        awk -F: '{print $1,$NF}' /etc/passwd
        root /bin/bash
    2)对记录(行)的提取
        指定行号:
        awk -F: 'NR==1{print $1,$NF};NR==3{print $1,$NF}' /etc/passwd
        root /bin/bash
        daemon /sbin/nologin
            注:NR:指定行号
        精确匹配
        awk -F: '$1=="user20"{print $1,$NF}' /etc/passwd
        user20 /bin/bash
        
        模糊匹配
        awk -F: '$1 ~ "^user20"{print $1,$NF}' /etc/passwd
        user20 /bin/bash
    
    3)定义变量和数组
        定义变量:
        awk -v name='jiangfeng' 'BEGIN{print name}'
        jiangfeng
        
        定义数组
        awk 'BEGIN{ array[0]="jiang";array[10]="feng";print array[0]}'
        jiang
    
    4)awk运算
        1.赋值运算=
        
        2.比较运算>= == < <= !=
            如果比较的是字符串则按ascii编码顺序表比较。如果结果返回为真则用1表示,如果返回为假则用0表示
            awk 'BEGIN{print "ca" >= "ba"}'
            1
            注:不能用">",意义为重定向
    
        3.数学运算 + - * / % ** ++ --
            [root@server88 ~]# awk 'BEGIN{print 2**100}'
            1267650600228229401496703205376
            [root@server88 ~]# awk -v 'num=1' 'BEGIN{num++;print num}'
            2
    
        4.逻辑运算 && ||
            awk -v 'val=a' 'BEGIN{print "ca" >= "ba" ||"a"==val}'
            1
        5.匹配运算 ~ !~ == !=
            详情见:2)对记录(行)的提取
    4.awk环境变量
    变量        描述
    FIELDWIDTHS    以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
    FS            输入字段分隔符号 数据源的字段分隔符-F
    OFS            输出字段分隔符号
    RS            输入记录分隔符
    ORS            输出记录分隔符号
    
    例:
    awk 'BEGIN{FIELDWIDTHS="5 2 8"}NR==1{print $1,$2,$3}' /etc/passwd
    root: x: 0:0:root
    
    awk 'BEGIN{FS=":"}NR==1{print $1,$NF}' /etc/passwd
    root /bin/bash
    
    awk 'BEGIN{FS=":";OFS="-"}NR==1{print $1,$NF}' /etc/passwd
    root-/bin/bash
    
    
    5.流程控制
    1)if判断语句
    awk '{if($1>5)print $0}' num
    awk '{if($1>5)print $1/2;else print $1*2}' num
    2)for循环语句
    awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' num2
    3)while循环语句
    awk '{sum=0;i=1;while(sum<150){sum+=$i;i++}print sum}' num2
    4)do...while语句
    awk '{sum=0;i=1;do{sum+=$i;i++}while(sum<150);print sum}' num2
  • 相关阅读:
    CPP--关于long的争议和思考
    CPP--借助神器VS理解内存存储(含大小端对齐)
    1.QT开发第一个程序
    POJ-1456 Supermarket 贪心问题 有时间限制的最小化惩罚问题
    HDU-4310 Hero 贪心问题
    HDU-1789 Doing Homework again 贪心问题 有时间限制的最小化惩罚问题
    HDU-2303 The Embarrassed Cryptographer 高精度算法(大数取模)
    【错题本】刷算法题中出现的一些错误和小技巧
    HDU-2050 折线分割平面 找规律&递推
    记intel杯比赛中各种bug与debug【其五】:朴素贝叶斯分类器的实现和针对性的优化
  • 原文地址:https://www.cnblogs.com/feng0919/p/11305445.html
Copyright © 2020-2023  润新知