• Bash-基础


    简介

    Bash(GNU Bourne-Again Shell)是一个为 GNU 计划编写的 Unix shell,它是许多 Linux 平台默认使用的 shell。

    shell 是一个命令解释器,是介于操作系统内核与用户之间的一个绝缘层。准确地说,它也是能力很强的计算机语言,被称为解释性语言或脚本语言。它可以通过将系统调用、公共程序、工具和编译过的二进制程序”粘合“在一起来建立应用,这是大多数脚本语言的共同特征,所以有时候脚本语言又叫做“胶水语言”。

    事实上,所有的 UNIX 命令和工具再加上公共程序,对于 shell 脚本来说,都是可调用的。Shell 脚本对于管理系统任务和其它的重复工作的例程来说,表现的非常好,根本不需要那些华而不实的成熟紧凑的编译型程序语言。

     

    初步练习Hello World

    Bash 之 Hello World

    使用 vim 编辑 hello.sh,输入如下代码并保存:

    vim hello.sh

    #!/bin/bash

    # This is a comment

    echo Hello World

    • vim 中插入按 i

    • 保存并退出换行按 esc 然后输入 :wq 再按下 enter

    • #! 是说明 hello 这个文件的类型,有点类似于 Windows 系统下用不同文件后缀来表示不同文件类型的意思(但不相同)。

      • Linux 系统根据 #! 及该字符串后面的信息确定该文件的类型,可以通过 man magic 命令 及 /usr/share/magic 文件来了解这方面的更多内容。

      • 在 BASH 中 第一行的 #! 及后面的 /bin/bash 就表明该文件是一个 BASH 程序,需要由 /bin 目录下的 bash 程序来解释执行。BASH 这个程序一般是存放在 /bin 目录下,如果你的 Linux 系统比较特别,bash 也有可能被存放在 /sbin 、/usr/local/bin 、/usr/bin 、/usr/sbin 或 /usr/local/sbin 这样的目录下;如果还找不到,你可以用 locate bash ,find / -name bash 2>/dev/null 或 whereis bash 这三个命令找出 bash 所在的位置;如果仍然找不到,那你可能需要自己动手安装一个 BASH 软件包了。

    • 第二行的 # This is a ... 就是 BASH 程序的注释,在 BASH 程序中从 # 号(注意:后面紧接着是 ! 号的除外)开始到行尾的部分均被看作是程序的注释。

    • 第三行的 echo 语句的功能是把 echo 后面的字符串输出到标准输出中去。由于 echo 后跟的是 "Hello World" 这个字符串,因此 "Hello World"这个字串就被显示在控制台终端的屏幕上了。需要注意的是 BASH 中的绝大多数语句结尾处都没有分号。

    运行 Bash 脚本的方式:

    # 使用shell来执行
    sh hello.sh
     
    # 使用bash来执行
    bash hello.sh
     
    # 使用.来执行
    . ./hello.sh
     
    # 使用source来执行
    source hello.sh
     
    # 还可以赋予脚本所有者执行权限,允许该用户执行该脚本
    chmod u+rx hello.sh
    ./hello.sh

    使用重定向>

    比如我们想要保存刚刚的 hello world 为一个文本,那么该怎么办呢?

    > 这个符号是重定向,执行以下代码,就会在当前目录下生成一个 my.txt。打开看看有没有 hello world

    #!/bin/bash

    echo "Hello World" > my.txt

    使用脚本清除 /var/log 下的 log 文件

    首先我们看一看 /var/log/dpkg.log 里面有啥东西。看看 /var/log/dpkg.log 文件内是否有内容。

    cat /var/log/dpkg.log

    这个文件中记录了我们使用 apt 安装的软件包的一些信息,现在我们需要写一个脚本把里面的东西清空,但是保留文件。

    vim cleanlogs.sh

    #!/bin/bash

    # 初始化一个变量

    LOG_DIR=/var/log

    cd $LOG_DIR

    cat /dev/null > dpkg.log

    echo "Logs cleaned up."

    exit

    说明:/dev/null 这个东西可以理解为一个黑洞,里面是空的(可以用 cat 命令看一看)。

    为什么 cleanlogs.sh 可以将 log 文件清除

    因为/dev/null,里面是空的,重定向到 /var/log/dpkg.log 文件后,就清空了 dpkg.log 文件的内容。

    运行脚本前,先使用 sudo chmod +x cleanlogs.sh 授予脚本执行权限。运行此脚本后,文件的内容将被清除。

    执行:

    由于脚本中含有对系统日志文件内容的清除操作,这要求要有管理员权限.不然会报 permission denied 错误。使用 sudo 命令调用管理员权限才能执行成功:

    sudo ./cleanlogs.sh

    • #!/bin/bash 这一行是表示使用 /bin/bash 作为脚本的解释器,这行要放在脚本的行首并且不要省略。

    • 脚本正文中以 # 号开头的行都是注释语句,这些行在脚本的实际执行过程中不会被执行。这些注释语句能方便我们在脚本中做一些注释或标记,让脚本更具可读性。

    遇到权限不够的提示,为什么,如何解决

    权限不够加 sudo ,可是会发现 sudo cat /dev/null > /var/log/dpkg.log 一样会提示权限不够,为什么呢?

    因为 sudo 只能让 cat 命令以 root 的权限执行,而对于 > 这个符号并没有 root 的权限。

    我们可以使用 sudo sh -c "cat /dev/null > /var/log/dpkg.log" 让整个命令都具有 root 的权限执行。

    实例

    步骤一

    新建一个 test.sh 输出 Hello Shiyanlou!

    步骤二

    复制 test.sh 为 test2.sh

    修改 test2.sh 实现将 Hello Shiyanlou 保存为 my.txt 文本

    步骤三

    新建一个 cleantest.sh 脚本运行实现清空 test.sh 里的内容

    提示

    • 复制为 cp
    • 创建的脚本文件都必须在 /home/shiyanlou/ 下

    参考

    步骤一

    /home/shiyanlou/test.sh 参考代码:

    #!/bin/bash
    echo "Hello Shiyanlou!"

    也可以使用 cat 命令:

    touch /home/shiyanlou/test.sh
    cat > /home/shiyanlou/test.sh << EOF
    #!/bin/bash
    echo "Hello Shiyanlou!"
    EOF

    步骤二

    复制 test.sh 为 test2.sh:`cp /home/shiyanlou/test{,2}.sh

    修改 test2.sh 的代码为:

    #!/bin/bash
    echo "Hello Shiyanlou!" > my.txt

    步骤三

    /home/shiyanlou/cleantest.sh 参考代码:

    #!/bin/bash
    cat /dev/null > test.sh

    也可以使用 cat 命令:

    touch /home/shiyanlou/cleantest.sh
    cat > /home/shiyanlou/cleantest.sh << EOF
    #!/bin/bash
    cat /dev/null > test.sh
    EOF

     关于<<EOF命令

    通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
    可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。

    回顾 < <的用法。当shell看到< <的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)

    这个分界符可以是你所定义的任何字符串。

    可以将”EOF“可以进行自定义,但是前后的”EOF“必须成对出现且不能和shell命令冲突。

    eg:

    自动登录mysql(root:root,passwd:123456),查询test库,test1表里的user=aa的记录。

    test.sh代码如下:

    #!/bin/sh
    mysql -uroot -p123456 <<CALLBACK
    use test;
    select * from testaa while a=10000; ###1000 not usr single quote mark,because a is int
    # type,only char type need single quote mark.
    exit
    CALLBACK

    1、特殊:(:是shell的空语句,所以下面的Shell脚本代码段不会被执行)

    : << COMMENTBLOCK
       shell脚本代码段
    COMMENTBLOCK

    2、cat和eof结合使用具有追加功能

    cat >> filename << EOF
    100
    200
    300
    EOF
    
    cat filename 100 200 300

     关于 < <、<、>、>>

    • <<<  部分匹配某个字符串
    • >  输出重定向到文件或设备 覆盖原来的文件
    • >!     输出重定向到一个文件或设备 强制覆盖原来的文件
    • >>  输出重定向,进行追加,不会覆盖之前的内容
    • <<  标准输入来自命令行的一对分隔号的中间内容(这个可以看EOF的实例)
    • <    输入重定向到一个程序,将后面文件作为前面命令的输入

    关于 <

    使用redis,往文本中写两行命令 然后将它作为redis 客户端的输入文件,发现命令执行。

    详细看linux shell 管道命令(pipe)使用及与shell重定向区别

    shell重定向(大于号,小于号,左右,2>&1,&)

    Linux shell中2>&1的含义解释

    Linux 输入输出重定向, &>file, 2>&1, 1>&2 等

    linux shell数据重定向(输入重定向与输出重定向)详细分析

    Linux中>、>>、<、<<重定向及管道命令

    linux 命令中的大于号、小于号的作用

  • 相关阅读:
    2015腾讯暑期实习笔试题目
    二叉树的优点和缺点
    pandas对象保存到mysql出错提示“BLOB/TEXT column used in key specification without a key length”解决办法
    事务的隔离机制
    Flink Sink定制开发
    Presto实现定时从配置文件读取配置
    LDAP与Sentry API使用
    Presto压测报告
    PrestoSPI安全扩展
    项目重构总结
  • 原文地址:https://www.cnblogs.com/dork/p/13802202.html
Copyright © 2020-2023  润新知