【从0到1 Shell】(三)第一个Shell程序

版权声明:本文为博主原创文章,转载请注明出处-- https://blog.csdn.net/qq_38790716/article/details/88224603

shell脚本的基本元素

H e l l o Hello B a s h Bash S h e l l Shell 开始来探讨 s h e l l shell 的基本元素:

例1: H e l l o Hello , B a s h Bash S h e l l Shell

#! /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会首先判断用户是否拥有该程序的执行权限,如果没有执行权限, s h e l l shell 会给出" P e r m i s s i o n Permission d e n i e d denied "的提示;否则, s h e l l shell 会创建一个新的进程,解释并执行 s h e l l shell 程序中的语句。

shell脚本中第1行的#! / b i n bin / b a s h bash 告诉当前 s h e l l shell 应该调用哪个 s h e l l shell 来执行当前的程序

"#!"标识后面指定解释器的绝对路径

用户还可以指定其他的一些命令,例如 m o r e more 或者 c a t cat 来显示当前程序的代码

例2:指定 m o r e more 命令作为脚本文件的解释器

# 指定命令解释器
#! /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
  • 多行注释:使用冒号":"配合 h e r e here d o c u m e n t document ,语法如下:
:<<BLOCK

....注释内容

BLOCK

例3:通过 h e r e here d o c u m e n t document 实现了多行注释

#! /bin/bash
  
:<<BLOCK
本脚本的作用是输出一行字符串
作者:二笙
BLOCK

echo "Hello world!"

如何执行shell程序

在Linux中,可以通过以下3种方式执行shell程序:

  • 授予用户执行该脚本文件的权限,使得该程序能够直接执行
  • 通过调用 s h e l l shell 脚本解释器来执行
  • 通过 s o u r c e source 命令来执行

第一种方法前面已经叙述过,就不再提了。现在来看第二种放方法,第二种方法就是将脚本文件作为参数传递给解释器,在通过这种方式执行脚本时,不需要用户拥有执行该脚本文件的权限,只要拥有读取该文件的权限即可

例4:

root@VM-0-2-ubuntu:/home/ubuntu/shell# /bin/bash ex1-5.sh
Hello, Bash Shell!

在上面的命令种,/ b i n bin / b a s h bash b a s h bash s h e l l shell 的绝对路径。用户首先调用 b a s h bash ,然后 b a s h bash 会载入 e x 1 5. s h ex1-5.sh ,并且解释其中的语句,最后给出程序执行的结果

第三种方法

s o u r c e source 命令是一个 s h e l l shell 内部命令,其功能是读取指定的 s h e l l shell 程序文件,并且执行其中所有的语句。该命令与前面两种方式的区别在于只是简单地读取脚本里的语句,并且依次在当前的 s h e l l shell 里面执行,并没有创建新的子 s h e l l shell 进程。脚本里面所创建的变量都会保存到当前的 s h e l l shell 里面

例5:

root@VM-0-2-ubuntu:/home/ubuntu/shell# source ex1-5.sh 
Hello, Bash Shell!

由于 s o u r c e source 是在当前的 s h e l l shell 种执行脚本文件,因此其执行结果可能会与前面两种方式不同

shell程序的退出状态

U N I X UNIX L i n u x Linux 中,每个命令都会返回一个退出状态码。退出状态码是一个整数,其有效范围为0~255。通常情况下,成功的命令返回0,而不成功的命令返回非0值。非0值通常被解释为一个错误码

同样, s h e l l shell 脚本中的函数和脚本本身也会返回退出状态码。在脚本或者是脚本函数中执行的最后命令会决定退出状态码。另外,也可以在脚本中使用 e x i t exit 语句将指定的退出状态码传递给 s h e l l shell

例如,在下面的脚本中,整个脚本的退出状态将由 s t a t e m e n t statement _ l a s t last 这条语句的退出状态来决定:

#! /bin/bash

statement1

...

#将由最后的命令来决定退出状态
statement_last

另外,在 s h e l l shell 中,系统变量$ ? ? 保存了最后一条命令的退出状态

#! /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

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/88224603
今日推荐