shell脚本基础、变量、数值运算
一、Shell 脚本基础
流程图
1. 创建并执行第一个脚本
# 创建脚本文件
[root@localhost ~]# vi hello.sh
#!/bin/bash
echo "Hello, World!" # 输出文本
# 赋予执行权限
[root@localhost ~]# chmod +x hello.sh
# 执行脚本
[root@localhost ~]# ./hello.sh
Hello, World!
执行方式 | 命令示例 | 权限要求 | 作用域差异 |
---|---|---|---|
直接执行 | ./script.sh | 需x权限 | 子shell环境 |
解释器调用 | bash script.sh | 无需x权限 | 子shell环境 |
源执行 | source script.sh | 无需x权限 | 当前shell环境 |
后台执行 | nohup script.sh & | 需x权限 | 脱离终端运行 |
2. 脚本调试模式
# 显示执行过程(-x)
[root@localhost ~]# bash -x hello.sh
+ echo 'Hello, World!'
Hello, World!
# 检查语法错误(-n)
[root@localhost ~]# bash -n hello.sh # 无输出表示语法正确
调试方法 | 命令示例 | 功能描述 | 适用场景 |
---|---|---|---|
逐行跟踪 | bash -x script.sh | 显示每行执行结果 | 逻辑错误排查 |
语法检查 | bash -n script.sh | 验证语法正确性 | 预防性检查 |
局部调试 | set -x 和 set +x | 代码块级调试 | 精确调试 |
错误退出 | set -e | 遇错立即终止 | 防止错误扩散 |
详细输出 | set -v | 打印原始命令 | 命令解析检查 |
二、Shell 变量操作
1. 变量定义与使用
# 定义普通变量
[root@localhost ~]# name="Linux Admin"
[root@localhost ~]# echo "User: $name"
User: Linux Admin
# 定义只读变量
[root@localhost ~]# readonly version="1.0"
[root@localhost ~]# version="2.0" # 报错:只读变量不可修改
bash: version: readonly variable
2. 环境变量管理
# 设置环境变量(当前会话有效)
[root@localhost ~]# export PATH=$PATH:/opt/bin
# 永久生效(写入配置文件)
[root@localhost ~]# echo 'export JAVA_HOME=/usr/java' >> ~/.bashrc
[root@localhost ~]# source ~/.bashrc # 立即生效
3. 特殊变量示例
- 特殊变量详解表
变量 | 含义 | 示例输出 | 典型应用 |
---|---|---|---|
$0 | 脚本名称 | ./test.sh | 日志记录 |
$# | 参数个数 | 3 | 参数校验 |
$@ | 所有参数 | "a" "b" "c" | 循环处理 |
$* | 参数字符串 | "a b c" | 整体传递 |
$? | 上条命令退出码 | 0 | 错误处理 |
$$ | 当前进程PID | 12345 | 临时文件命名 |
$! | 后台进程PID | 67890 | 进程管理 |
- 演示命令
# 创建测试脚本 args.sh
[root@localhost ~]# vi args.sh
#!/bin/bash
echo "脚本名: $0"
echo "第一个参数: $1"
echo "参数总数: $#"
echo "所有参数: $@"
# 带参数执行
[root@localhost ~]# ./args.sh apple banana
脚本名: ./args.sh
第一个参数: apple
参数总数: 2
所有参数: apple banana
三、数值运算
运算方法对比
运算方式 | 语法示例 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
$(( )) | result=$((a+b)) | 简洁高效 | 仅整数 | 基础计算 |
let | let "result=a*b" | 支持复杂表达式 | 需要引号 | 复合计算 |
expr | result=$(expr $a + $b) | 兼容性好 | 效率低 | 老系统兼容 |
$[ ] | result=$[a % b] | 简洁 | 已弃用 | 不推荐 |
运算优先级对比
优先级 | 运算符 | 描述 | 示例 |
---|---|---|---|
1 | ** | 幂运算 | 3**2=9 |
2 | * / % | 乘除取模 | 9/2=4 |
3 | + - | 加减 | 5+3=8 |
4 | << >> | 位移 | 8>>1=4 |
5 | < <= > >= | 比较 | 5>3=1 |
6 | == != | 相等判断 | 5==5=1 |
7 | && | 逻辑与 | 1&&0=0 |
8 | ` | ` |
1. 整数运算
# 使用 $(( ))
[root@localhost ~]# num1=15
[root@localhost ~]# num2=3
[root@localhost ~]# echo "加法: $((num1 + num2))" # 18
[root@localhost ~]# echo "取模: $((num1 % num2))" # 0
# 使用 let 命令
[root@localhost ~]# let "result = num1 ** num2" # 15的3次方
[root@localhost ~]# echo $result # 3375
2. 浮点数运算
# 使用 bc 计算器
[root@localhost ~]# echo "scale=2; 10/3" | bc # 3.33
[root@localhost ~]# area=$(echo "scale=4; 3.14159 * 5^2" | bc)
[root@localhost ~]# echo "圆面积: $area" # 78.53975
3. 自增运算
# 循环自增
[root@localhost ~]# count=0
[root@localhost ~]# for i in {1..5}; do
> let count++
> echo "计数: $count"
> done
计数: 1
计数: 2
计数: 3
计数: 4
计数: 5
命令总结表格
演示命令 | 功能描述 | 关键选项/语法 |
---|---|---|
chmod +x script.sh | 添加执行权限 | +x 赋予可执行权限 |
bash -x script.sh | 调试模式执行 | -x 显示执行过程 |
var="value" | 定义变量 | 等号两侧无空格 |
echo ${var} | 输出变量 | {} 明确变量边界 |
export PATH=$PATH:/new | 设置环境变量 | export 全局生效 |
$((a + b)) | 整数运算 | 支持 + - * / % ** |
let "c=a*b" | 数学表达式 | 可省略 $ 符号 |
`echo “1.2+3.4” | bc` | 浮点数运算 |
$0 $1 $# $@ | 脚本参数变量 | $0 脚本名, $1 首参数 |
功能作用详解
1. Shell 脚本基础
#!/bin/bash # Shebang 声明解释器
# 注释:描述脚本功能
echo "Start..." # 输出命令
-
执行方式:
./script.sh
:需可执行权限(chmod +x
)bash script.sh
:直接指定解释器执行
-
调试技巧:
set -x # 开启调试 set +x # 关闭调试
2. 变量管理
变量类型 | 定义方式 | 作用域 | 生命周期 |
---|---|---|---|
局部变量 | var=value | 当前 Shell 进程 | 进程结束销毁 |
环境变量 | export var=value | 所有子进程 | 重启终端销毁 |
只读变量 | readonly var=value | 当前 Shell 进程 | 不可修改 |
位置参数 | $1 $2 ... | 脚本内部 | 脚本执行期间 |
特殊变量 | $0 $# $? $$ | 全局 | 动态更新 |
-
变量操作:
${var} # 基础引用 ${var:-default} # 空值时用默认值 ${#var} # 获取字符串长度 ${var:2:4} # 截取子串(从2开始取4字符)
3. 数值运算
# 整数运算(推荐)
result=$((a + b * 2))
# 浮点数运算(bc 命令)
area=$(echo "scale=2; 3.14 * r * r" | bc)
# 自增/自减
let "counter++" # 等同于 ((counter++))
-
运算符优先级:
**
(幂运算)* / %
+ -
-
计算工具对比:
工具 支持类型 精度控制 复杂计算 $(( ))
整数 无 基础运算 bc
浮点数 scale=N
支持三角函数、对数 awk
浮点数 printf
格式化文本+计算混合处理
4. 最佳实践
-
变量命名规范
- 全大写命名环境变量:
export API_KEY="12345"
- 局部变量小写驼峰:
local fileName="log.txt"
- 全大写命名环境变量:
-
数值运算安全
# 除法防除零错误 [[ $divisor -ne 0 ]] && result=$((dividend / divisor))
-
脚本健壮性
set -e # 任何命令失败即终止 set -u # 使用未定义变量时报错 trap 'cleanup' EXIT # 捕获退出信号执行清理
综合案例:计算器脚本
#!/bin/bash
# 计算两个数的和/差/积/商
set -e
if [[ $# -ne 3 ]]; then
echo "用法: $0 <数字1> <运算符(+|-|*|/)> <数字2>"
exit 1
fi
case $2 in
+) result=$(($1 + $3)) ;;
-) result=$(($1 - $3)) ;;
\*) result=$(($1 * $3)) ;;
/)
if [[ $3 -eq 0 ]]; then
echo "错误:除数不能为0"
exit 1
fi
result=$(echo "scale=2; $1 / $3" | bc)
;;
*) echo "无效运算符: $2"; exit 1 ;;
esac
echo "结果: $result"