shell脚本的基本元素
从 , 开始来探讨 的基本元素:
例1: ,
#! /bin/bash
#输出字符串
echo "Hello, Bash Shell!"
结果:
root@VM-0-2-ubuntu:/home/ubuntu/shell# chmod +x ex1-5.sh
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-5.sh
Hello, Bash Shell!
对于一个基本的shell程序来说,应该拥有以下基本元素:
- 第1行的 “#! /bin/bash”
- 注释:说明某些代码的功能
- 可执行语句:实现程序的功能
指定命令解释器
当用户在命令行执行一个脚本程序的时候,shell会首先判断用户是否拥有该程序的执行权限,如果没有执行权限, 会给出" "的提示;否则, 会创建一个新的进程,解释并执行 程序中的语句。
shell脚本中第1行的#! / / 告诉当前 应该调用哪个 来执行当前的程序
"#!"标识后面指定解释器的绝对路径
用户还可以指定其他的一些命令,例如 或者 来显示当前程序的代码
例2:指定 命令作为脚本文件的解释器
# 指定命令解释器
#! /bin/more
#输出语句
echo "Hello world!"
结果:
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-7.sh
#! /bin/more
echo "Hello world!"
从本质上讲,"#!"标识的作用就是指定解释当前脚本文件的程序,至于最后的结果如何,还要看指定的程序
shell脚本中的注释风格
- 单行注释:在前面加一个"#"
#注释1
#注释2
#注释3
- 多行注释:使用冒号":"配合 ,语法如下:
:<<BLOCK
....注释内容
BLOCK
例3:通过 实现了多行注释
#! /bin/bash
:<<BLOCK
本脚本的作用是输出一行字符串
作者:二笙
BLOCK
echo "Hello world!"
如何执行shell程序
在Linux中,可以通过以下3种方式执行shell程序:
- 授予用户执行该脚本文件的权限,使得该程序能够直接执行
- 通过调用 脚本解释器来执行
- 通过 命令来执行
第一种方法前面已经叙述过,就不再提了。现在来看第二种放方法,第二种方法就是将脚本文件作为参数传递给解释器,在通过这种方式执行脚本时,不需要用户拥有执行该脚本文件的权限,只要拥有读取该文件的权限即可
例4:
root@VM-0-2-ubuntu:/home/ubuntu/shell# /bin/bash ex1-5.sh
Hello, Bash Shell!
在上面的命令种,/ / 是 的绝对路径。用户首先调用 ,然后 会载入 ,并且解释其中的语句,最后给出程序执行的结果
第三种方法
命令是一个 内部命令,其功能是读取指定的 程序文件,并且执行其中所有的语句。该命令与前面两种方式的区别在于只是简单地读取脚本里的语句,并且依次在当前的 里面执行,并没有创建新的子 进程。脚本里面所创建的变量都会保存到当前的 里面
例5:
root@VM-0-2-ubuntu:/home/ubuntu/shell# source ex1-5.sh
Hello, Bash Shell!
由于 是在当前的 种执行脚本文件,因此其执行结果可能会与前面两种方式不同
shell程序的退出状态
在 或 中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常被解释为一个错误码
同样, 脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后命令会决定退出状态码。另外,也可以在脚本中使用 语句将指定的退出状态码传递给
例如,在下面的脚本中,整个脚本的退出状态将由 _ 这条语句的退出状态来决定:
#! /bin/bash
statement1
...
#将由最后的命令来决定退出状态
statement_last
另外,在 中,系统变量$ 保存了最后一条命令的退出状态
#! /bin/bash
statement1
...
#将由最后的命令来决定退出状态码
statement_last
exit $?
此程序与上面的程序含义一致
不同情况下程序的退出状态
#! /bin/bash
echo "Hello world!"
#退出状态为0,命令执行成功
echo $?
#无效命令
abc
#非0的退出状态,命令执行失败
echo $?
echo
#返回120退出状态给shell
exit 120
结果:
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-9.sh
Hello world!
0
./ex1-9.sh: line 6: abc: command not found
127
//这个时候程序已经退出,所以需要手动输入获得退出状态码
root@VM-0-2-ubuntu:/home/ubuntu/shell# echo $?
120