【Ubuntu与Linux操作系统:九、Shell编程】
第9章 Shell编程
9.1 Shell编程基本步骤
Shell编程是一种通过编写脚本文件,使用Shell解释器执行批处理任务的方法。基本步骤如下:
1. 确定需求
在编写脚本之前,明确要实现的功能,例如文件备份、日志分析或自动化部署等。需求的清晰可以避免脚本逻辑冗杂。
2. 选择Shell解释器
常用的Shell包括bash
(默认)、zsh
、sh
等。在脚本开头通过shebang
指定解释器,例如:
#!/bin/bash
3. 创建脚本文件
使用文本编辑器(如vi
或nano
)创建脚本文件,通常以.sh
结尾,以便易于识别。例如:
nano myscript.sh
4. 编写脚本代码
- 定义变量:为数据提供临时存储。
- 使用命令:调用系统命令完成特定任务。
- 控制流:根据条件执行特定逻辑。
- 函数定义:模块化脚本,提高代码复用性。
5. 修改权限
通过chmod
命令赋予脚本执行权限:
chmod +x myscript.sh
6. 执行脚本
直接执行脚本:
./myscript.sh
或者通过解释器运行:
bash myscript.sh
7. 测试与调试
- 在执行脚本之前,逐行检查逻辑。
- 使用
set -x
开启调试模式,查看每条命令的执行结果。
Shell编程的步骤清晰且具有较高灵活性,可以帮助用户快速实现自动化任务。
9.2 Shell变量
Shell变量用于存储数据,分为局部变量和环境变量两种。
1. 变量的定义与使用
定义变量时无需声明类型,直接赋值即可,例如:
name="Ubuntu"
echo $name
注意,等号两侧不能有空格,引用变量时需加$
。
2. 变量类型
-
局部变量:仅在当前Shell中有效,默认所有变量为局部变量。
-
环境变量:在Shell和其子进程中共享,使用
export
声明:export PATH=$PATH:/new/path
3. 只读变量
变量定义后不允许修改,可使用readonly
命令:
readonly pi=3.14
4. 特殊变量
$0
:脚本文件名。$1-$9
:传递给脚本的参数。$#
:参数个数。$@
:所有参数。$$
:当前脚本进程ID。
5. 数组变量
Shell支持一维数组,可以通过以下方式定义和访问:
arr=(one two three)
echo ${arr[1]} # 输出:two
Shell变量的灵活性使其成为脚本中处理数据的重要工具。
9.3 表达式与运算符
Shell支持多种运算符,用于执行数学计算和逻辑判断。
1. 算术运算
使用$(( ))
或expr
进行计算,例如:
result=$((5 + 3))
echo $result # 输出8
使用expr
:
result=$(expr 5 \* 3)
2. 关系运算符
用于比较数字,常见运算符包括:
-eq
:等于-ne
:不等于-gt
:大于-lt
:小于
示例:
if [ $a -gt $b ]; then echo "a大于b"; fi
3. 字符串运算
=
:字符串相等!=
:字符串不等-z
:字符串长度为0-n
:字符串长度非0
4. 逻辑运算
&&
:逻辑与||
:逻辑或!
:逻辑非
5. 文件测试运算
-e
:文件存在-f
:是普通文件-d
:是目录
Shell运算符的丰富性,提供了编写复杂逻辑脚本的能力。
9.4 流程控制语句
流程控制语句决定脚本的执行顺序,包括条件判断和循环。
1. 条件判断
-
if-else语句:
if [ $a -gt $b ]; then echo "a大于b" else echo "a小于等于b" fi
-
case语句:多分支条件判断:
case $var in 1) echo "Option 1";; 2) echo "Option 2";; *) echo "Other option";; esac
2. 循环语句
-
for循环:遍历列表:
for item in one two three; do echo $item done
-
while循环:条件为真时执行:
while [ $count -lt 5 ]; do echo $count count=$((count + 1)) done
-
until循环:条件为假时执行:
until [ $count -ge 5 ]; do echo $count count=$((count + 1)) done
Shell的流程控制语句提供了灵活的脚本逻辑控制能力。
9.5 函数
函数是Shell脚本中的模块化工具,用于封装一组指令,增强代码复用性和可维护性。
1. 函数定义与调用
函数定义时无需声明返回类型:
my_function() {
echo "Hello, $1"
}
my_function "World"
2. 函数参数
函数可接收参数,通过$1
, $2
访问:
add() {
echo $(( $1 + $2 ))
}
add 5 3 # 输出8
3. 返回值
Shell函数返回值通过return
指定(0表示成功,非0表示失败),或通过echo
输出:
get_value() {
echo $(( $1 * 2 ))
}
result=$(get_value 5)
4. 函数库
可将常用函数定义在单独文件中,通过source
或.
引入:
source my_functions.sh
Shell函数提升了脚本的组织能力,尤其适合复杂任务的处理和分解。