Linux——9
9. Shell 脚本
9.1. 编写shell脚本(重要)
9.1.1. 注意
- 等号两端不能有空格
- [ command ] 中括号两端一定要有空格
-

9.1.2. 分支结构(if)
9.1.2.1. if 语句
- 语法:
if expression
then[elif expressionthenthen-command-list]...[elseelse-command-list]
fi
- 目的:实现双向或多路分支。
- 示例:
if [ expression ]
thencommands
elif [ expression ]
thencommands
elsecommands
fi
9.1.2.2. 简化的 if 语句
- 语法:
if expression
thenthen-commands
fi
- 目的:实现双向分支。
- 示例:
if [ expression ]; thencommands
fi
9.1.3. 循环结构
9.1.3.1. for 语句
for variable [in argument-list]
docommand-list
done
9.1.3.2. while 语句
while expression
docommand-list
done
9.1.4. 键盘输入
用 read 命令来获取用户的键盘输入。
示例(Shell 脚本):
#!/bin/bashecho "请输入你的名字:"
read name
echo "你好,$name!"
在这个脚本中,read 命令用于从键盘读取用户输入的名字,并将其存储在变量 name 中。
9.1.5. 命令行参数
命令行参数是在执行脚本时直接在命令行中传递给脚本的值。这些参数可以通过特殊变量 $1, $2, $3, ... 等来访问,其中 $1 是第一个参数,$2 是第二个参数,依此类推。
$0:代表脚本本身的名称。当你运行一个脚本时,$0就是该脚本的文件名。$1:代表传递给脚本的第一个参数。$2:代表传递给脚本的第二个参数。
示例(Shell 脚本):
#!/bin/bash# 脚本名为 script.shif [ $# -eq 0 ]; then # 检查是否有参数传入echo "请提供名字作为参数,例如: ./script.sh 你的名字"exit 1finame=$1 # 第一个参数存入 name 变量echo "你好, $name!"
在这个脚本中,$1 表示第一个命令行参数。脚本检查是否提供了参数($# 是参数的数量),如果没有提供参数,则打印用法信息并退出。
9.2. 命令操作符

9.2.1. 文件测试(File Testing)
| 表达式 | 返回值 | 描述 |
|
| 真/假 | 如果文件是目录,则为真。 |
|
| 真/假 | 如果文件是普通文件,则为真。 |
|
| 真/假 | 如果文件可读,则为真。 |
|
| 真/假 | 如果文件长度非零,则为真。 |
|
| 真/假 | 如果文件描述符与终端关联,则为真。 |
|
| 真/假 | 如果文件可写,则为真。 |
|
| 真/假 | 如果文件可执行,则为真。 |
9.2.2. 整数测试(Integer Testing)
| 表达式 | 返回值 | 描述 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
9.2.3. 字符串测试(String Testing)
| 表达式 | 返回值 | 描述 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
|
| 真/假 | 如果 |
9.2.4. 形成复杂表达式的操作符(Operators for Forming Complex Expressions)
| 操作符 | 描述 |
|
| 逻辑非操作符:如果后续表达式为假,则为真。 |
|
| 逻辑与操作符:如果前一个(左)和后一个(右)表达式都为真,则为真。 |
|
| 逻辑或操作符:如果前一个(左)或后一个(右)表达式为真,则为真。 |
|
| 括号用于分组表达式,每个括号前后至少有一个空格。 |
9.3. 运行 Bourne Shell 脚本的方法
- 使脚本文件可执行:
-
- 通过添加执行权限使脚本文件可执行。
- 使用命令:
chmod u+x script_file
- 直接运行脚本文件:
-
- 使用
/bin/sh或/bin/bash命令运行脚本文件作为其参数。 - 使用命令:
/bin/bash script_file
- 使用
- 使用 source 或 . 命令:
-
- 使用
source或.命令运行脚本文件作为参数。 - 使用命令:
/bin/source script_file
- 使用
- 强制当前 shell 执行脚本:
-
- 强制当前 shell 执行脚本,无论当前 shell 是什么。
- 使用命令:
#!/bin/bash(在脚本的第一行,称为 shebang)
9.4. Shell 特殊变量($)
#!/bin/bash
echo "===== Shell 特殊变量演示 ====="
echo "脚本名: $0"
echo "参数个数: $#"
echo "所有参数(\$*): $*"
echo "所有参数(\$@): $@"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "当前脚本进程ID(\$\$): $$"
| 环境变量 | 用途 |
|
| 程序的名称 |
|
| 命令行参数的值,从1到9 |
|
| 所有命令行参数的值 |
|
| 所有命令行参数的值;如果参数被引号包围,则每个参数单独引用 |
|
| 命令行参数的总数 |
|
| 当前进程的进程ID(PID) |
|
| 最近一个命令的退出状态 |
|
| 最近一个后台进程的PID |
9.5. 命令替换
定义:
- 当一个命令被包含在反引号(`)中或
$()中时,shell 会执行该命令,并将其输出替换到命令的位置(包括反引号或$())。
语法:
- 使用反引号:`command`
- 使用
$():$(command)
目的:
- 将命令的输出替换为该命令。
9.5.1. 示例
假设你想要获取当前目录下的文件列表,并将其作为 ls 命令的参数:
- 使用反引号:
echo \`ls\`
这将输出当前目录下的文件列表。
- 使用
$():
echo $(ls)
这也将输出当前目录下的文件列表。
9.5.2. 注意事项
- 命令替换通常用于脚本中,以便动态获取命令的输出并将其作为参数传递给其他命令。
- 使用
$()时,可以嵌套命令,例如:$($(command1))。 - 使用反引号时,需要注意转义字符,例如:`echo "Hello, World!"`。
9.6. 数值数据处理
- 变量值存储:
-
- Bourne Shell 变量的值被存储为字符字符串。
- 执行算术和逻辑操作:
-
- 为了在变量上执行算术和逻辑操作,需要将它们转换为整数。
- 确保操作结果转换回字符字符串,以便在 shell 变量中正确存储。
示例
a=10
b=20
sum=$((a + b)) # 计算和,并将结果存储在变量 sum 中
在这个例子中,$((a + b)) 会执行算术运算,并将结果转换为整数。然后,这个整数结果被存储在变量 sum 中。
9.6.1. expr 命令
- 语法:
expr args - 目的:计算表达式参数
args并将结果发送到标准输出。
9.6.2. 常用操作符/特性
- 逻辑运算符:
-
\|:如果第一个表达式不为 null 或 0,则返回第一个表达式;否则返回第二个表达式。\&:如果两个表达式都不为 null 或 0,则返回第一个表达式;否则返回 0。
- 整数比较运算符:
-
=,\>,\>=,\<,\<=,!=:用于比较两个整数是否相等、大于、大于等于、小于、小于等于、不等于。
- 整数算术运算符:
-
+,-,\*,/,%:用于整数加法、减法、乘法、除法(返回商)、求余。
result=$(2 + 3)
echo $result
这将输出 5。
9.6.3. 浮点数表达式
bc:一个任意精度的计算器语言。- 使用
echo expression | bc来计算浮点数表达式。
示例
echo "2.5 + 3.7" | bc
这将输出 6.2。
9.6.4. 注意事项
- 在进行算术运算时,确保使用
$(( ))或expr命令来正确执行运算。 - 逻辑运算通常需要使用外部命令如
test或[ ]。 - 转换回字符串时,可以使用
$符号或echo命令。
