• Bash


    Prerequisite

    Bash 是 Unix 系统和 Linux 系统的一种 Shell(命令行环境),是目前绝大多数 Linux 发行版的默认 Shell

    Shell 这个单词的原意是“外壳”,跟 kernel(内核)相对应,比喻内核外面的一层,即用户跟内核交互的对话界面

    Shell 是一个程序,提供一个与用户对话的环境,这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境(command line interface,简写为 CLI),用户还可以用 Shell 命令写出各种小程序,又称为脚本(script)

    Shell 的种类

    历史上,主要的 Shell 有下面这些:

    • Bourne Shell(sh)
    • Bourne Again shell(bash)
    • C Shell(csh)
    • TENEX C Shell(tcsh)
    • Korn shell(ksh)
    • Z Shell(zsh)
    • Friendly Interactive Shell(fish)
    # 查看当前运行的 Shell
    echo $SHELL
    
    # 查看当前的 Linux 系统安装的所有 Shell
    cat /etc/shells
    
    # 查看本机的 Bash 版本
    bash --version
    

    命令行环境 -- 终端模拟器

    终端模拟器”(terminal emulator)就是一个模拟命令行窗口的程序,让用户在一个窗口中使用命令行环境

    不同 Linux 发行版(准确地说是不同的桌面环境)带有的终端程序是不一样的,比如 KDE 桌面环境的终端程序是 konsole,Gnome 桌面环境的终端程序是 gnome-terminal,用户也可以安装第三方的终端程序

    命令行环境 -- 命令行提示符

    # 初始界面
    [user@hostname] $
    
    # 这是我 Win 上的 WSL
    # ubuntu@LAPTOP-B5FOUNH6
    

    上面例子中,完整的提示符是[user@hostname] $,其中前缀是用户名(user)加上@,再加主机名(hostname

    基本语法

    echo 命令

    多行输出

    echo "<HTML>
        <HEAD>
              <TITLE>Page Title</TITLE>
        </HEAD>
        <BODY>
              Page body.
        </BODY>
    </HTML>"
    

    -n 参数

    取消末尾的回车符

    echo -n a;echo b
    
    # Output:ab
    

    -e 参数

    解释引号(双引号和单引号)里面的特殊字符

    echo -e "Hello\nWorld"
    
    # Output:
    # Hello
    # World
    

    加个注释

    echo HelloWorld # Annotation
    
    # Output:HelloWorld
    

    空格

    Bash 使用空格(或 Tab 键)区分不同的参数,但不区分空格(多个)与 Tab 键

    分号

    使得一行可以放置多个命令

    快捷键

    • Ctrl + L:清除屏幕并将当前行移到页面顶部。
    • Ctrl + C:中止当前正在执行的命令。
    • Ctrl + U:从光标位置删除到行首。
    • Ctrl + K:从光标位置删除到行尾。

    模式扩展

    Bash 是先进行扩展,再执行命令,模式扩展早于正则表达式出现,可以看作是原始的正则表达式,Bash 内置了共八个扩展

    开启扩展 / 关闭扩展

    # 开启扩展
    set -o noglob
    set -f
    
    # 关闭扩展
    set +o noglob
    set +f
    

    波浪线扩展

    # 波浪线 ~ 会自动扩展成当前用户的主目录
    echo ~
    
    # 进入 /home/me/foo 目录
    cd ~/foo
    
    # 相当于 pwd
    echo ~+
    

    ? 字符扩展

    # ? 字符代表文件路径里面的任意单个字符
    ls ?.txt
    
    # Output:a.txt b.txt
    

    * 字符扩展

    # * 字符代表文件路径里面的任意数量的任意字符,包括零个字符
    ls *.txt
    
    # Output:a.txt b.txt ab.txt
    
    # 彩蛋
    
    # 如果想输出当前目录的所有文件,相当于 tree -L 2
    ls *
    
    # 显示所有隐藏文件
    echo .*
    

    方括号扩展

    # 匹配括号之中的任意一个字符
    ls [ab].txt
    
    # Output:a.txt b.txt
    

    [start-end] 扩展

    # 字面意思的扩展
    ls [a-c].txt
    
    # Output:
    a.txt
    b.txt
    c.txt
    
    # 常用简写的例子
    # [a-z]:所有小写字母
    # [a-zA-Z]:所有小写字母与大写字母
    # [a-zA-Z0-9]:所有小写字母、大写字母与数字
    # [abc]*:所有以a、b、c字符之一开头的文件名
    # program.[co]:文件program.c与文件program.o
    # BACKUP.[0-9][0-9][0-9]:所有以BACKUP.开头,后面是三个数字的文件名
    

    大括号扩展

    # 输出大括号里面的所有值
    echo d{a,e,i,u,o}g
    
    # Output:dag deg dig dug dog
    
    # PS:大括号内部的逗号前后不能有空格,否则大括号扩展会失效
    

    {start..end} 扩展

    # 表示扩展成一个连续序列
    echo Number_{1..5}
    
    # Output:Number_1 Number_2 Number_3 Number_4 Number_5
    
    # 支持逆序
    echo {c..a}
    
    # Output:c b a
    
    # 常见用途为新建一系列目录(下面例子共创建 9 个文件夹)
    mkdir {2020..2022}-{01..03}
    
    # 可以指定扩展的步长
    echo {0..8..2}
    
    # Output:0 2 4 6 8
    

    变量扩展

    # 字面意思的扩展
    echo ${SHELL}
    echo $SHELL
    
    # Output:/bin/bash
    

    子命令扩展

    # 扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值
    echo $(date)
    
    # Output:Tue Jan 28 00:01:13 CST 2020
    

    算术扩展

    # 字面意思的扩展
    echo $((2 + 2))
    # Output:4
    

    字符类

    # 输出所有大写字母开头的文件名
    echo [[:upper:]]*
    

    量词语法

    # extglob 参数打开时才能使用
    # 查看参数是否打开
    shopt extglob
    
    # 打开 extglob 参数
    shopt -s extglob
    
    # ?(.) 匹配零个或一个点
    ls abc?(.)txt
    
    # Output:abctxt abc.txt
    
    # ?(def) 匹配零个或一个def
    ls abc?(def)
    
    # Output:abc abcdef
    
    # +(.txt|.php) 匹配文件有一个.txt或.php后缀名
    ls abc+(.txt|.php)
    
    # Output:abc.php abc.txt abc.txt.txt
    
    # +(.txt) 匹配文件有一个或多个.txt后缀名
    ls abc+(.txt)
    
    # Output:abc.txt abc.txt.txt
    
    # !(b) 表示匹配单个字母b以外的任意内容
    ls a!(b).txt
    
    # Output:a.txt abb.txt ac.txt
    

    shopt 命令

    # 打开某个参数
    shopt -s [optionname]
    
    # 关闭某个参数
    shopt -u [optionname]
    
    # 查询某个参数关闭还是打开
    shopt [optionname]
    
    # dotglob 参数可以让扩展结果包括隐藏文件
    
    # nullglob 参数可以让通配符不匹配任何文件名时,返回空字符
    # 命令:rm b* => rm (当前目录不包括 b 开头的文件名时)
    
    # failglob 参数使得通配符不匹配任何文件名时,Bash 会直接报错,而不是让各个命令去处理
    # 命令:rm b* => Bash 直接报错 (当前目录不包括 b 开头的文件名时)
    
    # extglob 参数使得 Bash 支持 ksh 的一些扩展语法
    
    # nocaseglob 参数可以让通配符扩展不区分大小写
    
    # globstar 参数可以使得**匹配零个或多个子目录
    # 命令:**/*.txt == *.txt  +  */*.txt  +  */*/*.txt
    

    引号和转义

    # 反斜杠可以将单行命令改成多行
    ls \
    -a
    
    # 相当于 ls -a
    

    单引号

    单引号用于保留字符的字面含义(各种特殊字符在单引号里面,都会变为普通字符)

    echo '*'
    # Output:*
    
    echo '$USER'
    # Output:$USER
    
    echo '$((2+2))'
    # Output:$((2+2))
    
    echo '$(echo foo)'
    # Output:$(echo foo)
    

    双引号

    双引号相比单引号规则宽松(这三个字符:美元符号($)、反引号(`)和反斜杠(\),在双引号之中依然有特殊含义)

    echo "$SHELL"
    # Output:/bin/bash
    
    echo "`date`"
    # Output:Mon Jan 27 13:33:18 CST 2020
    
    echo "I'd say: \"hello!\""
    # Output:I'd say: "hello!"
    
    # 另一个常见的使用场合是,文件名包含空格
    touch "two words.txt"
    
    # 会保存多余的空格
    echo "this is a     test"
    
    # Output:this is a     test
    
    # 会保存原始命令的输出格式
    echo "$(cal)"
    
    # Output:
       November 2021
    Su Mo Tu We Th Fr Sa
        1  2  3  4  5  6
     7  8  9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30
    

    Here 文档

    是一种输入多行字符串的方法,格式如下:

    << name
    text
    name
    
    # 文档内部只支持 反斜杠符号(转义)和美元符号(变量替换)
    foo='hello world'
    cat << _example_
    $foo
    "$foo"
    '$foo'
    _example_
    
    # Output:
    hello world
    "hello world"
    'hello world'
    
    # 不希望发生变量替换,把 Here 文档的开始标记放在单引号之中即可
    foo='hello world'
    cat << '_example_'
    $foo
    "$foo"
    '$foo'
    _example_
    
    # Output:
    $foo
    "$foo"
    '$foo'
    
    # Here 文档的本质是重定向(将字符串重定向输出给某个命令)
    
    command << token
      string
    token
    
    # 等同于
    
    echo string | command
    
    # PS:但是上述 command 不包括 echo
    

    Here 字符串

    作用是将字符串通过标准输入,传递给命令【感觉没什么用~】

    cat <<< 'hi there'
    
    # 等同于
    
    echo 'hi there' | cat
    

    剩下的

    懒得学了。。。

  • 相关阅读:
    微信小程序入门注意
    回调函数理解实例
    2017最新教程--如何下载美拍视频
    tomcat如何利用waf进行防护
    深入理解正则表达式-----应用于检测csrf的正则表达式
    snort安装--daq,dnet---ERROR! dnet header not found, go get it from...等错误解决方案
    先知安全技术社区原创文章奖励计划
    谈一谈情报威胁与态势感知
    pfring破解DNA限制
    八皇后--python代码
  • 原文地址:https://www.cnblogs.com/CourserLi/p/15456392.html
Copyright © 2020-2023  润新知