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
-
切换到脚本所在目录执行
$ cd /home/shell $ ./hello.sh
./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的,脚本必须有可执行权限
-
绝对路径执行
$ /home/shell/hello.sh
-
以脚本解释器的参数执行
$ sh /home/shell/hello.sh 或 $ cd /home/shell $ sh hello.sh
sh命令重新建立了一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
sh命令执行脚本可以不需要执行权限。
-
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的选项检查语法
-
检查语法 -v
bash -v hello.sh
-v选项会检查脚本中的语法错误,如上面脚本中把第一个echo写成了ech会提示:
hello.sh: line 4 ech command not found
-
追踪脚本执行 -x
bash -x hello.sh
这个选项会打印脚本执行的每一行
也可以和-e选项配合,-e: 如果shell中的任何一行失败,则整个shell运行会立刻终止