Shell 脚本基础、组成结构、调试与运算符

发布于:2025-09-10 ⋅ 阅读:(14) ⋅ 点赞:(0)

Shell 脚本基础、组成结构、调试与运算符

一、脚本基础

1、Shell 编程介绍与特性

Shell 是一种命令解释程序,也可以看作是一种命令语言的解释器。用户在与 Shell 交互时所输入的命令行必须符合 Shell 命令的语法和语义规范,才能够被 Shell 理解并执行。Shell 所使用的这种命令语言称为 Shell 语言。Shell 语言不仅仅是一种交互式语言,它还是一种可编程的程序设计语言。

将若干个 Shell 命令行写入一个文件就构成了一个 Shell 程序,它可以被 Shell 逐条地解释执行。用 Shell 语言编写的 Shell 程序可以使用各种变量、参数和控制结构来组织命令流程,自动化地完成各种复杂冗繁的处理工作。

Linux 系统中广泛使用了 Shell 程序来实现系统的初启、配置、管理和维护等工作。因此,熟练掌握 Shell 语言可以更加深入地理解系统的运行机制,更加有效地使用和管理系统。

Shell 语言的特点:

与其他编程语言相比,Shell 语言具有如下特点:

  • (1)Shell 是一种解释性语言。这就是说,用 Shell 语言写的程序不需编译,可以直接由 Shell 进程解释执行。解释性语言的特点是快捷方便,可以即编即用,但与编译性语言的目标程序来比,解释性语言程序的运行速度要低一些。
  • (2)Shell 是基于字符串的语言。Shell 只是做字符串处理,不支持复杂的数据结构和运算。Shell 的输出也全部是字符方式的。
  • (3)Shell 是命令级语言。Shell 程序全部由命令而不是语句组成,几乎所有的 Shell 命令和可执行程序都可用来编写 Shell 程序。Shell 命令十分丰富,命令的组合功能也十分强大。所以,用简单的命令和命令组合形成的 Shell 程序即简洁又高效,可以实现各种复杂的功能。另外需要说明的是,不同版本的 Shell 程序不完全兼容,差别可能是细微的,也可能是明显的。

Shell 程序也称 Shell 脚本,是由一系列 Shell 命令为基本元素构成的文本文件。简单的 Shell 程序可以只是一个命令序列,高级 Shell 程序中还可以包含复杂的命令组合,定义各种参数和变量、使用条件命令、控制结构以及其他高级特性。

2、变量

(1)什么是变量?

顾名思义,变量就是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。变量几乎所有的程序设计语言中都有定义,并且其涵义也大同小异。从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。

(2)变量的命名

在 Shell 中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,Shell 并没有做出明确的规定。因此,用户可以使用任意长度的字符串来作为变量名。但是,为了提高程序的可读性,建议用户使用相对较短的字符串作为变量名。

在一个设计良好的程序中,变量的命名有着非常大的学问。通常情况下,用户应该尽可能选择有明确意义的英文单词作为变量名,尽量避免使用拼音或者毫无意义的字符串作为变量名。这样的话,用户通过变量名就可以了解该变量的作用。

(3)变量的类型
  • 整型int age=10
  • 浮点型float salary=3.1
  • 字符型:在 Shell 中,加了引号的字符就是字符串类型(单引号、双引号,也可以不用引号)。例如:msg="hello cy"
    注意:字符串包含空格必须加引号。
msg=cy
echo $msg

连续字符不加引号包含也是可以的,但是我们还是强烈建议加上引号,规范一些。

单引号和双引号的意义是不同的:

  • 双引号 " ":弱引用,引号的特殊字符有意义。
  • 单引号 ' ':强引用,引号内所有特殊字符都取消意义。

示例:

[root@server ~]# name="cy"
[root@server ~]# echo "${name} is good"
cy is good
[root@server ~]# echo '${name} is good'
${name} is good
  • 布尔型:它只能是 TrueFalse,表示真假是非。

3、脚本执行方式

  • (1)使用绝对路径执行。
  • (2)使用相对路径执行。语法格式:./a.sh
  • (3)使用 shbash 命令来执行。语法格式:sh a.sh(不需要执行权限)。
  • (4)使用 .(空格)脚本名称来执行。语法格式:. a.sh(不需要执行权限,注意 . 后面有空格)。
  • (5)使用 source 来执行。语法格式:source a.sh(不需要执行权限,主要用于生效配置文件)。

4、Shebang 机制

#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

二、脚本的组成结构

1、脚本的组成

  • (1)开头:#!/bin/bash,其中符号 #! 是用来告诉系统我们是用什么解析器来执行的。
  • (2)注释:以 # 开头的行表示注释。
  • (3)命令行的书写规则:一行为一条命令,一行多条命令时需用 ; 分割,分割长命令可以使用反斜杠 \

示例:

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

2、程序返回值

程序执行以后有两类返回值echo $?

  • (1)程序执行的结果。
  • (2)程序状态返回代码(0-255):
    • 0:正确执行。
    • 1-255:错误执行。

三、Shell 脚本调试

1、脚本执行的过程解析

当 Shell 脚本运行时,它会先查找系统环境变量 ENV,该变量指定了环境文件(加载顺序通常是 /etc/profile、当前用户家目录下的 .bash_profile、当前用户家目录下的 .bashrc/etc/bashrc 等),在加载了上述环境变量文件后,Shell 就开始执行 Shell 脚本中的内容。

Shell 脚本是从上至下、从左至右依次执行每一行的命令及语句的,即执行完了一个命令后再执行下一个。如果在 Shell 脚本中遇到子脚本(即脚本嵌套)时,就会先执行子脚本的内容,完成后再返回父脚本继续执行父脚本内后续的命令及语句。

2、脚本执行的原理

Shell 在解释命令的时候并不是自己亲自执行,而是派生子进程让子进程去完成这项工作。这样的好处是把风险交给别人,当指令的执行出现问题时不会影响到 Shell(影响到其他指令的执行)。Shell 不可以挂,Shell 一旦挂就没有什么可以解释命令了。对我们而言,Shell 为了保证自己风险最低,通过创建子进程进行命令行的解释工作,而 Shell 自己只要去等就可以了。

3、写脚本注意事项

  • (1)开头加解释器:#!/bin/bash
  • (2)语法缩进,使用四个空格;多加注释说明。
  • (3)命名建议规则:变量名大写,局部变量小写,函数名小写,名字体现出实际作用。
  • (4)默认变量是全局的,在函数中变量用 local 指定为局部变量,避免污染其他作用域。
  • (5)有两个命令能帮助调试脚本:set -e(遇到执行非 0 时退出脚本)、set -x(打印执行过程)。
  • (6)写脚本一定要先测试再到生产上。
  • (7)脚本中的命令一定要用绝对路径。
  • (8)引用命令时需要用反引号 ```。

4、脚本调试方法

  • bash -n 脚本名:检查脚本是否有语法错误。
  • bash -x 脚本名:单步执行,检查脚本错在哪里。

特殊字符类:

  • [[:alpha:]]:代表任意大小写字母。
  • [[:digit:]]:代表任意整数。
案例:

(1)创建目录 /tmp/chenyu
(2)切换到 /tmp/chenyu 目录
(3)创建目录 a1bb2c6cy
(4)创建空文件 xyx123y123
(5)列出当前目录下以 a 或者 6 开头的文件或目录,将这些文件或目录导入到 /tmp/file1 文件中
(6)列出当前目录下以字母开头,后跟着一个任意数字,再者后面跟任意长度字符的文件或目录,将这些文件或目录导入到 /tmp/file2 文件中

#!/bin/bash
mkdir /tmp/ydh
cd /tmp/ydh
mkdir a1b b2c 6cy
touch xy x123y 123
ls | grep "^[a|6]" > /tmp/file1
ls | grep "[[:alpha:]][[:digit:]]" > /tmp/file2

四、运算符

原生的 Bash 并不支持简单的数学运算,通常要通过其他命令来实现。

1、算术运算符

ab 都是变量:

  • 加法:expr $a + $b
  • 减法:expr $a - $b
  • 乘法:expr $a \* $b
  • 除法:expr $b / $a
  • 取余:expr $b % $a
  • 赋值:a=$b
  • 相等:[ $a == $b ]
  • 不相等:[ $a != $b ]

示例:

#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"

其他算术运算方式:

A=3
B=6
let C=$A+$B        # let 算术运算表达式
C=$[ $A+$B ]       # $[算术运算表达式]
C=$(( $A+$B ))     # $((算术运算表达式))
C=`expr $A + $B`   # expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
例题:

写一个脚本,传递两个整数给此脚本,让脚本分别计算并显示这两个整数之和、差、积、商。

#!/bin/bash
a=20
b=10

let jia1=$a+$b
jia2=$[ $a+$b ]
jia3=$(( $a+$b ))
jia4=`expr $a + $b`

let jian1=$a-$b
jian2=$[ $a-$b ]
jian3=$(( $a-$b ))
jian4=`expr $a - $b`

let cheng1=$a*$b
cheng2=$[ $a*$b ]
cheng3=$(( $a*$b ))
cheng4=`expr $a \* $b`

let chu1=$a/$b
chu2=$[ $a/$b ]
chu3=$(( $a/$b ))
chu4=`expr $a / $b`

echo "$jia1,$jia2,$jia3,$jia4"
echo "$jian1,$jian2,$jian3,$jian4"
echo "$cheng1,$cheng2,$cheng3,$cheng4"
echo "$chu1,$chu2,$chu3,$chu4"

2、逻辑运算

  • 逻辑与&&,相当于是 AND 的关系。
    • 第一个条件为假时,第二个条件不用再判断,最终结果已经是 false。
    • 第一个条件为真时,第二个条件必须得判断。
  • 逻辑或||,相当于是 OR 的关系。
    • 前一个命令的结果为真时,第二个命令就不执行。
    • 前一个命令的结果为假时,第二个命令必须执行。

网站公告

今日签到

点亮在社区的每一天
去签到