Shell 脚本基础、组成结构、调试与运算符
Shell 脚本基础、组成结构、调试与运算符
一、脚本基础
1、shell 语言介绍
-
Shell 编程介绍与特性
Shell 是一种命令解释程序,也是一种命令语言的解释器。用户输入的符合 Shell 语法和语义的命令行可以被 Shell 理解并执行。Shell 不仅是一种交互式语言,还是一种可编程的程序设计语言。
-
Shell 语言的特点
-
解释性语言:无需编译,直接由 Shell 解释执行,快捷方便但运行速度较低。
-
基于字符串的语言:仅做字符串处理,不支持复杂数据结构和运算。
-
命令级语言:由命令组成,命令组合功能强大,简洁高效。
-
Shell 程序(也称 Shell 脚本)是由一系列 Shell 命令构成的文本文件,可包含变量、参数和控制结构。
2、变量
-
变量的定义
变量是程序中保存用户数据的一块内存空间,变量名是内存地址的标识。 -
命名规则
-
由字母、数字或下划线组成。
-
必须以字母或下划线开头。
-
建议使用有明确意义的英文单词命名。
-
-
变量类型
-
整型:age=10
-
浮点型:salary=3.1(注:Shell 默认不支持浮点,需借助其他工具)
-
字符串:
-
可加单引号(强引用,特殊字符无意义)或双引号(弱引用,特殊字符有意义)。
-
若字符串含空格,必须加引号。
-
-
布尔型:True 或 False
3、脚本执行方式
- 绝对路径执行:
/path/to/script.sh
- 相对路径执行:
./script.sh
(需执行权限) - 使用 sh 或 bash 命令:
sh script.sh
(无需执行权限) - 使用 . 执行:
. script.sh
(无需执行权限,注意点号后有空格) - 使用 source 执行:
source script.sh
(常用于生效配置文件)
4、Shebang 机制
脚本首行指定解释器,例如:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
二、脚本的组成结构
1、脚本的组成
- 开头:
#!/bin/bash
- 注释:以
#
开头 - 命令书写规则:
- 一行一条命令。
- 多条命令用
;
分隔。 - 长命令可用
\
换行。
2、程序返回值
- 执行结果:标准输出或错误输出。
- 状态返回码:
0
表示成功,1-255
表示错误。
三、脚本调试
1、脚本执行过程
- 先加载环境变量(如
/etc/profile
、~/.bashrc
等)。 - 从上至下、从左至右执行命令。
- 遇到子脚本先执行子脚本,再返回父脚本。
2、执行原理
Shell 通过创建子进程执行命令,自身仅等待结果,以降低风险。
3、写脚本注意事项
- 开头加
#!/bin/bash
- 语法缩进(4空格),多加注释
- 变量名建议:全局变量大写,局部变量小写,函数名小写
- 函数中使用
local
定义局部变量 - 调试命令:
set -e
(非0退出)、set -x
(打印执行过程) - 先测试再上线
- 使用绝对路径命令
- 命令引用使用反引号 ```或
$()
4、调试方法
bash -n script.sh
:检查语法错误bash -x script.sh
:单步执行,显示详细过程
5、案例
使用
[[:alpha:]]
匹配任意字母,[[:digit:]]
匹配任意数字。(1)创建目录/tmp/chenyu
(2)切换到/tmp/chenyu目录
(3)创建目录a1b b2c 6cy
(4)创建空文件 xy x123y 123
(5)列出当前目录下以a或者6开头的文件或目录,将这些文件或目录导入到/tmp/file1文件中
(6)列出当前目录下以字母开头,后跟着一个任意数字,再者后面跟任意长度字符的文件或目录,将这些文件或目录导入到/tmp/file2文件中
[root@yanyvhang tmp]# vim test1.sh
# 脚本内容
#!/bin/bash
mkdir /tmp/yy
cd /tmp/yy
mkdir a1b b2c 6cy
touch xy x123y 123
ls | grep "^[ a|6 ]" > /tmp/file1
ls | grep "^[[:alpha:]][[:digit:]]" > /tmp/file2
# 给予权限并运行脚本
[root@yanyvhang tmp]# chmod +x test1.sh
[root@yanyvhang tmp]# ./test1.sh
四、运算符
1、算术运算符
原生 Bash 不支持数学运算,需借助其他命令:
- 加法:
expr $a + $b
- 减法:
expr $a - $b
- 乘法:
expr $a \* $b
- 除法:
expr $b / $a
- 取余:
expr $b % $a
- 赋值:
a=$b
- 相等:
[ $a == $b ]
- 不相等:
[ $a != $b ]
算术运算方式:
- let C=A+A+A+B
- let算术运算表达式
- C=$[ A+A+A+B ]
- $[算术运算表达式]
- C=$(( A+A+A+B ))
- $((算术运算表达式))
- C=
expr $A + $B
- expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
写一个脚本,传递两个整数给此脚本,让脚本分别计算并显示这两个整数之和,差,积,商
[root@yanyvhang tmp]# vim test2.sh
# 脚本内容
#!/bin/bash
x=10
y=5let jia=$x+$y
echo "x+y: $jia"jian=$[ $x-$y ]
echo "x-y: $jian"cheng=$(( $x*$y ))
echo "x*y: $cheng "chu=`expr $x / $y`
echo "x/y: $chu"
# 基于权限并运行
[root@yanyvhang tmp]# chmod +x test2.sh
[root@yanyvhang tmp]# ./test2.sh
2、逻辑运算
- 逻辑与:
&&
第一个条件为假时跳过第二个条件。 - 逻辑或:
||
第一个条件为真时跳过第二个条件。