Linux shell编程介绍

Shell是一种用于和操作系统交互的命令解析器软件,也可以称为Linux命令解释器。

Shell程序常称为Shell脚本,Shell脚本大体由变量定义、内置命令、流程控制语句、函数等构成。Shell脚本文件本质上仍是一个文本文件 所以编写shell程序只需要普通的文本编辑器即可(如vi,vim,emaces等)

Linux常见的shell解释器有:

  • sh,unix默认shell
  • bash,Linux默认shell,路径/bin/bash,bash完全兼容sh
  • zsh,是一款功能强大的 shell 软件,它可以兼容 bash,并且提供了很多高效的改进
  • csh
  • tcsh csh增强版

第一个shell脚本示例:

新建一个名为hello.sh的文件,扩展名为.sh(注:扩展名并不影响脚本执行,所以你可以使用其它扩展名或不用扩展名).

输入如下代码并保存:

#!/bin/bash

# 定义函数
function welcome(){
    echo "hello $1"
}

# 定义变量
name="baby"

# 调用函数
welcome "$name"

sleep 5

# 调用echo命令
echo "Bye Bye!"

脚本第1行固定以#!开头, 表示要用/bin/bash解释、执行这个脚本文件。您也可以使用/bin/sh,它其实是一个指向/bin/bash的软链接。

注:其他#开头是注释语句

运行Shell脚本的方法

假设脚本所在目录/home/shell,执行前给脚本设置可执行权限chmod +x hello.sh

  1. 切换到脚本所在目录执行

    $ cd /home/shell
    $ ./hello.sh  
    

    ./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的,脚本必须有可执行权限

  2. 绝对路径执行

    $ /home/shell/hello.sh
    
  3. 以脚本解释器的参数执行

    $ sh /home/shell/hello.sh
    或
    $ cd /home/shell
    $ sh hello.sh
    

    sh命令重新建立了一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。

    sh命令执行脚本可以不需要执行权限。

  4. source命令或 . 符号

    如在脚本a.sh中调用b.sh,调用代码如下

    ...
    echo "开始调用b.sh"
    . /home/shell/b.sh
    
    echo "再次调用b.sh"
    source /home/shell/b.sh
    ...
    

    上面代码展示两种脚本中调用其他脚本的方法,注意第一种.和/中间是有空格分开的

    source命令(从 C Shell 而来)是bash shell的内置命令,点符号,(从Bourne Shell而来)是source的另一名称。

    source命令读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。举例:

    在myfunc.sh中定义一个函数:

    #!/bin/bash
    test(){
     echo 'the source command test'
    }
    

    终端执行: source myfunc.sh,此时函数被导入到了当前shell,可以在shell中直接执行该函数

    [root@localhost ~]# test
    the source command test
    

    source命令经常用于重新执行刚修改的初始化文档,如 .bash_profile 和 /etc/profile这些配置文件。例如在profile中设置环境变量是不会即时生效的,既要注销重登录。而使用source命令则可以避免注销:

    vi /etc/profile
    ...
    export PATH=$JAVA_HOME/bin:$PATH
    ...
    

    source /etc/profile

shell脚本调试

shell脚本开发排错或调试需以第三种方法执行,通过指定bash的选项检查语法

  1. 检查语法 -v

    bash -v hello.sh
    

    -v选项会检查脚本中的语法错误,如上面脚本中把第一个echo写成了ech会提示:

    hello.sh: line 4 ech command not found

  2. 追踪脚本执行 -x

    bash -x hello.sh
    

    这个选项会打印脚本执行的每一行

    也可以和-e选项配合,-e: 如果shell中的任何一行失败,则整个shell运行会立刻终止



查看Linux命令手册