四十八、【Linux系统shell脚本】编写及执行脚本 、 Shell变量 、 数值运算

一、Shell 脚本基础

流程图

创建.sh文件
添加Shebang声明
编写脚本内容
赋予执行权限
执行脚本
调试与优化
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 -xset +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错误处理
$$当前进程PID12345临时文件命名
$!后台进程PID67890进程管理
  • 演示命令
# 创建测试脚本 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))简洁高效仅整数基础计算
letlet "result=a*b"支持复杂表达式需要引号复合计算
exprresult=$(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++))
  • 运算符优先级:

    1. **(幂运算)
    2. * / %
    3. + -
  • 计算工具对比:

    工具支持类型精度控制复杂计算
    $(( ))整数基础运算
    bc浮点数scale=N支持三角函数、对数
    awk浮点数printf格式化文本+计算混合处理

4. 最佳实践

  1. 变量命名规范

    • 全大写命名环境变量:export API_KEY="12345"
    • 局部变量小写驼峰:local fileName="log.txt"
  2. 数值运算安全

    # 除法防除零错误
    [[ $divisor -ne 0 ]] && result=$((dividend / divisor))
    
  3. 脚本健壮性

    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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱听雨的少年

感谢老板支持,早日成为技术大牛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值