zoukankan      html  css  js  c++  java
  • Linux Shell——bash shell 脚本简介

    Linux Shell

    bash shell 脚本简介

    shell 运行环境

    如果你运行的是 Unix 或 Linux 系统,例如 Ubuntu,Red Hat,SUSE Linux,还有macOS,都是内置了 bash shell 的,所以你不需要额外配置所谓的开发环境。

    我的 shell 环境是 macOS Sierra 版本,如果你用的是其他 Linux 系统,后面的例子基本上都是可以运行的。

    首先,打开Terminal 命令行,先检查下你的系统的 shell 版本:

    echo $BASH_VERSION
    

    BASH_VERSION

    bash 命令层次结构

    命令类型

    bash shell 内置了一个type命令会根据你输入的单词来显示此命令的类型,主要有以下五种类型:

    • 别名
    • 方法
    • shell 内置命令
    • 关键字
    • 文件

    例如,我们经常使用的cd命令,我们来执行下面的命令来看下它属于哪种类型。

    type cd
    

    type cd

    同时,为了查看更加详细的信息,可以使用

    type -a cd
    

    type -a cd

    如果想查看的信息更加简洁和适合人们理解,可以使用如下命令和参数:

    type -t ls
    

    type -t ls

    PATH 命令

    Linux会检查配置在 PATH 环境中的指定路径的程序是否可以执行。通常情况下,当前目录是不会被查找,除非你把它配置到PATH 中,我们可以执行如下命令,把当前目录加到 PATH 环境中。

    export PATH=$PATH:.
    

    接下来,我们创建一个存放 shell 脚本的目录bin,可以用如下命令来执行:

    $ test -d $HOME/bin || mkdir $HOME/bin
    

    当然你可以在你的主目录下手动创建目录 bin。上面的意思是检查主目录是否有 bin 目录,没有则创建。

    创建脚本

    没啥说的,学习每一种语言的第一个程序就是“Hello,World”,文件名叫 hello1.sh。

    #! /bin/bash
    echo "Hello World"
    exit 0
    

    解释一下: #!/bin/bash:通常情况下,脚本的默认第一行代码就是它。“#!”又被成为shebang。它用来告诉系统的解释器来执行脚本。除了 bash,我们还可以PHP,Perl等其他脚本。 echo "Hello World":echo 是一个内置的命令,用来表示标准输出,类似于 Java 中的System.out.println()exit 0:表示脚本结束退出,exit有一个整型参数,0表示正常退出,非0表示脚本执行中有错误。

    执行脚本

    现在,我们来执行上面的脚本,你可以在命令行下,进入到脚本文件存在的目录,也可以是在任意目录下,但是,在执行的时候,文件的路径就应该为绝对路径:

    bash $HOME/bin/hello1.sh
    

    执行结果为,打印出“Hello world”。

    Hello world

    Tip 在执行上面的命令中,可能会报错,提示权限不足或访问拒绝的错误。这是因为 hello1.sh 没有执行的权限。所以我们使用如下命令给文件加上对应的权限。 chmod +x $HOME/bin/hello1.sh

    脚本中的一些特殊参数

    在脚本中,有些表示特殊含义的参数,下面列出常见的几个:

    参数标识符 含义
    $0 文件本身的名字
    $1 表示位置的参数,第一个参数传递给脚本
    ${10} 在超过两位数的参数时,使用大括号限定起来
    $# 参数的个数
    $* 表示所有的参数

    如下所示:

    #! /bin/bash
    echo "file name $(basename $0)"
    echo "Hello $1"
    echo "Hello $*"
    echo "Args count: $#"
    exit 0 
    

    输出的结果为:

    hello2.sh

    重视引号的正确使用

    到现在,我们使用了双引号来包围字符串用于 echo 命令的输出。 在第一个 Hello1.sh中,使用单引号还是双引号,效果是一样的。下面的两行代码是等效的。

    echo "Hello World"
    echo 'Hello World'
    

    但是,在包含有变量的引用时,单引号和双引号的效果是不一样的。

    echo "Hello $1" // 打印传递的值,例如 Tim。
    echo 'Hello $1' // 把$1原样打印出来
    

    所以,在有变量的字符串里,推荐使用双引号。这时,$1就会被变量的值所替代,而不是作为字符串显示出来。

    打印脚本名字

    前面提到过,特殊参数$0用来表示脚本的名字,这里的名字会带有完整的路径,如果我们只想要文件名的话,可以使用以下代码:

    echo "You are using $(basename $0)"
    

    这里$(….)语法的作用是我们先执行括号里面的命令,然后然后把结果赋给外面不知名的变量。 $(….)语法还有一种相等的写法,注意,是键盘上数字1左边的按键,不是单引号。

    echo "You are using `basename $0`"
    

    个人不推荐这种写法,太容易混淆,不容易差错。

    调试你的脚本

    如果想调试你的脚本,bash给我们提供了两个选项:-v 和-x。 如果我们想逐行详细地查看脚本的内容,可以使用-v 选项。

    #! /bin/bash
    echo "file name $(basename $0)"
    echo "Hello $1"
    echo "Hello $*"
    echo "Args count: $#"
    exit 0
    

    -v

    更常用的是-x 选项,它们在执行时显示命令。当我们决定选择分支的时候,更加使用。

    -x 可以看到,basename最先执行了,使用此选项不会看到代码的详情。

  • 相关阅读:
    开发中学习英语
    eclipse 常用快捷键
    eclipse 查看快捷键
    沟通的方式——大道至简第四章读后感
    java练习题——类与对象
    团队与管理方法——大道至简第三章读后感
    java程序——两数的加减乘除
    java练习题
    java程序——从命令行接收多个数字,求和之后输出结果
    李冰烧山——大道至简第二章读后感
  • 原文地址:https://www.cnblogs.com/IcanFixIt/p/6769571.html
Copyright © 2011-2022 走看看