Shell脚本入门:从零构建你的第一个bash脚本

发布时间:2026/7/11 6:19:00
Shell脚本入门:从零构建你的第一个bash脚本 一、使用多个命令串联与管道Shell脚本的核心能力之一是将多个命令组合执行。1. 分号串联顺序执行将多个命令放在同一行用分号;隔开Shell会按顺序依次执行bashdate ; who效果先显示当前日期时间再显示当前登录用户列表。2. 管道连接传递结果使用管道符|可以将前一个命令的输出作为后一个命令的输入最终只显示最后一个命令的输出bashdate | who效果date的输出被传给who但who不接收标准输入所以实际上等同于只执行who。更典型的管道示例bashls -l | grep .sh二、创建与执行Shell脚本文件1. 创建脚本文件使用vim创建.sh后缀的文件第一行必须指定解释器bash#!/bin/bash# 这是一个注释echo Hello, Shell!#! 告诉系统用哪个Shell程序来运行脚本普通#用于注释2. 执行脚本的两种方法方法一直接调用bash命令bashbash test.sh方法二赋予可执行权限后用路径执行bashchmod x test.sh./test.sh # 相对路径# 或 /home/zhang/zz/sh_script/test.sh 绝对路径如果不加执行权限会报错 Permission denied三、echo命令与消息显示echo用于向控制台输出文本消息帮助用户了解脚本运行状态。基础用法bashecho 正在执行脚本...-n 参数不换行将文本和后续命令输出显示在同一行bash#!/bin/bashecho -n 当前用户是who输出当前用户是zhang pts/0 2026-07-10 10:30四、变量使用1. 引用环境变量在变量名前加$即可引用bash#!/bin/bashecho 当前用户家目录$HOMEecho 当前路径$PWD如果只想显示$符号本身需要加反斜杠转义bashecho \$HOME 是环境变量2. 自定义变量由字母、数字、下划线组成长度≤20区分大小写赋值时两边不能有空格bash#!/bin/bashnamezhangage20echo 姓名$name年龄$age脚本退出后变量在命令行中不可见局部变量3. 命令替换——将命令输出赋给变量两种语法bash# 反引号方式旧current_datedate %y%m%d# $()方式推荐更清晰current_date$(date %y%m%d)实战生成唯一文件名bash#!/bin/bashprefixbackupdate_suffix$(date %y%m%d)filename${prefix}_${date_suffix}.logecho 生成的文件名$filename五、wc命令——统计文件行数wcword count默认输出三个值行数、词数、字节数。常用参数参数含义-l只显示行数-w只显示词数-c只显示字节数示例bash# 查看单个脚本的行数wc -l test.sh# 查看所有.sh文件的总行数wc -l *.sh六、数学运算Shell默认只支持整数运算有四种方式。1. expr命令bashexpr 100 50expr 100 \* 2 # 乘号需要转义注意运算符与数字之间必须有空格2. $[ ] 或 $(( )) 推荐bashecho $[100 * (50 - 45)] # 输出 500echo $((100 / 52)) # 输出 1整数除法不需要转义符空格可有可无支持变量basha10b3echo $[a * b] # 输出 303. bc计算器支持浮点数bc是内建计算器支持浮点运算。命令行交互bashbcscale410/3quit在脚本中使用bcbash#!/bin/bashresult$(echo scale4; 100 / 52 | bc)echo 结果$result注意options和expression之间用分号;隔开先写scale再写表达式七、退出状态码每个命令执行完毕后都会返回一个0~255的整数值0表示成功非0表示失败。查看退出状态码bashls /homeecho $? # 显示上一条命令的退出码在脚本中自定义退出码bash#!/bin/bashecho 执行完毕exit 5 # 手动指定退出码为5执行后运行echo $?会显示5。---八、综合实战脚本将以上知识点整合到一个脚本中bash#!/bin/bash# 综合示例脚本echo -n 开始执行时间date# 使用命令替换生成文件名filenamereport_$(date %y%m%d).txtecho 本次报告将保存为$filename# 自定义变量user_namezhangecho 操作者$user_name# 数学运算整数a100b45result$[a * (50 - b)]echo 100*(50-45) $result# 浮点数运算使用bcfloat_result$(echo scale2; 100 / 52 | bc)echo 100/52 $float_result# 统计脚本自身行数line_count$(wc -l $0)echo 本脚本共有 $line_count 行echo 脚本执行完毕正常退出exit 0执行结果截图示意请根据实际运行截图替换开始执行时间2026年 07月 10日 星期五 10:30:00 CST本次报告将保存为report_260710.txt操作者zhang100*(50-45) 500100/52 1.92本脚本共有 18 行脚本执行完毕正常退出九、知识框架总结类别命令/语法用途关键点多命令顺序执行命令间无关管道\|传递输出只显最终结果脚本创建#!/bin/bash指定解释器必须第一行执行脚本bash/chmod x运行脚本路径或命令输出消息echo显示文本-n不换行引用变量$VAR取变量值环境/自定义命令替换$(...)命令输出附变量推荐写法行数统计wc -l统计行数支持通配符整数运算$[...]/$((...))数学计算不用转义浮点运算bc浮点数计算需scale退出状态$?/exit检查/设置退出码0成功