zoukankan      html  css  js  c++  java
  • linux —— shell 编程(整体框架与基础笔记)

    导读

    关于shell编程基础的学习,网上有很多资源,如果在校图书馆应该也有一些教程,所以这里对于零碎的基础不做详细记录,而只是对一些常用的概念、命令与操作做一个简要的记录,以备方便查找。

    (本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行)


    目录
    1. 终端、shell 和 bash
    2. 常用的基础命令
    3. Linux Shell 的变量
    4. 编程语法 与 文本处理
    5. 正则表达式
    6. 进程相关
    1、终端、shell 和 bash

    详细的区别与联系:点这里

    一个最简单的 “Hello world” 显示 程序:

    #! /bin/bash
    echo "Hello world"
    echo.sh

    #!/bin/bash 的作用:说明是用哪一个shell 来解释文件,如果没写,默认使用 $SHELL 里设置的shell

    #! 可以用来指定不同的命令解释器,比如我们指定 rm 程序, 以下是一个自删除脚本:

    #!/bin/rm
    # 自删除脚本
    # 当你运行这个脚本时,基本上什么都不会发生...... 当然这个文件消失不见了
    WHATEVER = 65
    echo "This line will never print"    
    exit $WHATEVER                        #脚本不会执行上面这几句
    #!/bin/rm
    2、常用的基础命令

    echo:显示一个字符串

    pwd:打印当前工作目录

    whereis: 查看与程序相关的路径

    source: 在当前的环境下执行指定的脚本文件,其执行结果会影响当前环境,比如执行的脚本 中cd执行会影响当前工作目录

    more 或 less : 以翻页的方式查看文件,less 相比与 more 多了一些功能上的特性

    cat: (连接文件)将文件输出到标准输出

    head | tail: 输出文件的头或尾的一部分

    grep: 打印符合特定模式的行

    > | : 重定向 和 管道

    ls 显示当前目录下的文件(ll 等)

    read: 从标准中读取一行

    printf "Enter new password:"
    stty-echo
    read poss < /dev/tty
    printf "Enter again"
    read pass2 < /dev/tty
    ......
    例子:/dev/tty 读取密码

    文件和文件夹的基本操作:点这里

    3、Linux Shell 的变量
    普通变量:

    例子:

    1 vname="content"
    2 echo "$vname"
    3 echo '$vname'

    变量赋值:= 的两边不能有任何空格

    变量援引:line 2 显示 “content” ;line 3 显示 “$vname”

    数值变量运算:

    let "var += 4"
    var=$(($var + 4))
    环境变量:

    unset:从当前shell删除变量或函数

    export:修改当前进程的环境变量

    env:显示环境中的环境变量和对于的值

    注意:env 和 set 函数不同。env函数显示的是环境变量,而set显示的是所有本地变量,包括用户的环境变量。

    环境变量相关文件的设置:点这里

    shell 脚本语法:(条件、循环等)  点这里

    4、编程语法 与 文本处理

    由于这两部分内容相对较多,为避免文章篇幅过大,这两部分分别在具体的文章里记录。

    编程语法:点这里

    文本处理:点这里

    5、正则表达式
    概要

     正则表达式在UNIX/Linux 系统中有广泛的结合与应用,用来强化工具本身的功能。常见的 UNIX 下支持正则表达式的工具有:

    • 用于匹配文本行的 grep 工具族
    • 用于改变输入流的 sed 流编辑工具(steam editor)
    • 用于处理字符串的语言,如 awk 、python 、perl 、Tcl 等语言
    • 文件查看程序,或分页程序,如more ,page,less
    • 文本编辑器,如 ed,vi, emacs,vim 等

    gerp 族有曾有三种版本:

    grep 最早的文本匹配程序。使用 POSIX 支持的基本正则表达式 (Basic Regular Expression, BRE)

    egrep 拓展的grep 。使用拓展正则表达式 (Extended Regular Expression,ERE)

    fgrep 快速grep (fast/fixed grep)。这个版本用于匹配固定字符串而不是正则表达式

    1992 年 POSIX标准 将其合而为一,只推荐使用grep,其他用参数来支持。

    基础

    正则表达式中有两种基本字符匹配,特殊字符(meta Character , 元字符)和一般字符。

    POSIX BRE 和 ERE 都支持的meta字符:

    ^    锚定行或字符串的开始。BRE仅在正则表达式的结尾处有意义,ERE在正表达式的任何地方都

         有特殊意义(.*^word  在ERE有效,但是意义?)

    $    锚定行或字符串的结尾。在BRE 与 ERE的区别同上

    .     匹配一个非换行符的字符。

    *      匹配先前字符任意多个,包括0

    [...]   方括号表达式(Bracket Expression ),匹配方括号里任意一个字符 [^A-FH-Z] 表示匹

         配大写字母G和其他除大写字母外的字符/

         用于打开或关闭后续字符的特殊含义。如 ()

    POSIX BRE 和ERE 支持不同的meta字符

    仅 BRE:

    ()     ()两个符号之间的模式被储存在保留空间(Holding Space),在后续通过转义引用,最多储

           存9个。(a).*1 表示2个a中间有任意字符的串。

          与上面的()结合使用,n为1~9

    x{m,n}  x表示模式,表示x出现m~n次,x{n}  表示出现n次,x{m,} 表示出现至少m次

    仅 ERE:

    x{m,n}  同上一条

    +     相比* , 不包括0

    ?      匹配0个或1个

    |      匹配前面 “或” 后面的正则表达式

    ()      匹配使用括号括起来的正则表达式群,如 (a.*a)|(b.*b) 表示匹配2个a中间有任意字符的串 或 2个b的情况。

    GNU 版本 的grep 支持额外的 meta字符:

    <    锚定单词的开始(不仅仅是行的开始)

    >    锚定单词的结束

    w    匹配文字和数字字符,等价于 [A-Za-z0-9]

    W    w 的反义

        锁定单词,如“grep”只匹配前后有空格或行开始与行结束的串

    为了在不同国家的字符编码中保持一致,POSIX (The Portable Operating System Interface)增加了特殊的字符类:

    [:alnum:]  A-Za-z0-9

    [:alpha:]  文字字符

    [:blank:]  space 和 tab

    [:digit:]   数字

    [:graph:]  非空字符(非空格、控制字符)

    [:lower:]  小写字符

    [:cntrl:]   控制字符

    [:print:]    可打印字符,非空字符(包括空格)

    [:punct:]  标点符号

    [:space:]   space  和tab 和 换行符

    [:upper:]  大写字符

    [:xdigit:]   十六进制数 (0-9,a-f ,A-F)

    这样就可以使用[:alpha:]匹配中文了;上面字符使用的时候必须置于[] 中才能成为正则表达式。

    比如匹配数字字母下划线: grep -E "[[:digit:][:alpha:]_]+"

    6、进程相关

    ps: 显示当前进程的快照 (常用参数 aux 或 -elf )

    pstree: 打印进程结构

    top : 显示系统的进程

    后台方式启动程序:command &

    jobs: 查看当前会话的作业状态 (-l 参附加地显示任务的进程号)

    Ctrl-Z: 可以使前台任务挂起暂停执行

    bg:   (将当前作业带入后台) 对于后台挂起暂停的进程,转到后台继续执行; 使用 %jobID 参数可以指定具体的进程

    fg:  将后台进程 (由+号指定) 置于前台

    stty tostop : 如果后台具有终端输出。该命令强制停止该作业

    kill -l : 列出所有进程调度信号

    nice:  以指定的优先级启动一个程序

    crontab 和 at :调度例程或单个(一次)系统任务。

    产生信号的方式:

    1) 终端按键:Ctrl+C: SIGINT       Ctrl+Z:SIGSTOP          Ctrl+:SIGQUIT

    2) 通过系统调用:kill -SIGTERM 45624  |  kill -9 4546

    3) 通过函数(软件):kill(SIGTERM,456465);

  • 相关阅读:
    word2013下,公式居中,编号右对齐
    Linux系统下,anaconda3与系统python共存
    LeetCode: 496 Next Greater Element I(easy)
    LeetCode: 463 Island Perimeter(easy)
    LeetCode: 620 Not Boring Movies(easy)
    C++: 其他类型转string
    LeetCode: 412 Fizz Buzz(easy)
    LeetCode: 344 Reverse String
    LeetCode: 566 Reshape the Matrix
    LeetCode: 575 Distribute Candies(easy)
  • 原文地址:https://www.cnblogs.com/BensonLaur/p/5849740.html
Copyright © 2011-2022 走看看