Shell编程核心入门:参数传递、运算符与流程控制全解析

在Linux/Unix系统中,Shell作为命令解释器和脚本语言,是自动化运维、批量处理任务的核心工具。掌握Shell脚本的参数传递运算符使用流程控制,能让你从“手动执行命令”升级为“编写脚本自动完成复杂任务”。本文将结合实例,详细拆解这三大核心知识点,助你快速入门Shell编程。

文章目录

  • Shell编程核心入门:参数传递、运算符与流程控制全解析
    • 一、Shell参数传递:让脚本更灵活
      • 1.1 基础:参数传递与获取方式
        • 传递参数的语法
        • 脚本内获取参数的语法
      • 1.2 关键区别:$* vs $@
        • 实例验证
      • 2.2 关系运算符:判断数值大小
        • 实例:比较两个参数大小
      • 2.3 逻辑运算符:组合条件判断
        • 实例:判断数值是否在指定范围
      • 2.4 文件测试运算符:判断文件属性
        • 实例:检查脚本是否可执行
    • 三、Shell流程控制:控制脚本执行逻辑
      • 3.1 选择结构:根据条件执行不同代码
        • 1. if语句:单支、双支、多支判断
        • 实例:根据分数判断等级
        • 2. case语句:多值匹配判断
        • 实例:简单菜单交互
    • 四、综合实例:Shell脚本实战
    • 五、总结

一、Shell参数传递:让脚本更灵活

在执行Shell脚本时,我们可以通过命令行向脚本传递参数,实现“同一脚本处理不同数据”的需求。比如编写一个计算两个数之和的脚本,通过参数传入不同数字,无需修改脚本即可得到结果。

1.1 基础:参数传递与获取方式

传递参数的语法

执行脚本时,参数紧跟在脚本名后,用空格分隔

./脚本名 参数1 参数2 参数3 ...

例如:./calc.sh 10 20 表示向calc.sh脚本传递参数1020

脚本内获取参数的语法

脚本中通过$n获取第n个参数(n为数字),特殊变量用于获取参数整体信息:

变量含义示例(以上述./calc.sh 10 20为例)
$0当前脚本的文件名$0 输出 ./calc.sh
$1~$n第1个到第n个参数$1 输出 10$2 输出 20
$#传递的参数总数$# 输出 2
$*所有参数的集合(作为一个整体字符串)"$*" 输出 "10 20"
$@所有参数的集合(作为独立参数列表)"$@" 输出 "10" "20"

1.2 关键区别:$* vs $@

$*$@都表示“所有参数”,但被双引号包裹时行为完全不同,这是Shell参数传递的高频考点:

场景$*的行为$@的行为
不被""包裹均以$1 $2 ... $n形式输出参数列表均以$1 $2 ... $n形式输出参数列表
""包裹合并为一个字符串:"$1 $2 ... $n"保持独立参数:"$1" "$2" ... "$n"
实例验证

创建param_demo.sh脚本:

#!/bin/bash
echo "=== \$* 演示 ==="
for arg in "$*"; doecho "参数:$arg"
doneecho "=== \$@ 演示 ==="
for arg in "$@"; doecho "参数:$arg"
done

执行脚本:./param_demo.sh 1 2 3,输出结果:

=== $* 演示 ===
参数:1 2 3
=== $@ 演示 ===
参数:1
参数:2
参数:3

结论:循环处理独立参数时,优先使用"$@";需将所有参数作为整体字符串处理时,使用"$*"

## 二、Shell运算符:实现脚本的计算与判断
Shell本身不支持直接数学运算,需通过工具(如`expr`)或特殊语法(如`$(( ))`)实现。运算符按功能分为**算术运算符**、**关系运算符**、**逻辑运算符**和**文件测试运算符**。### 2.1 算术运算符:处理数值计算
常用算术运算符:`+`(加)、`-`(减)、`*`(乘)、`/`(除)、`%`(取余)、`++`(自增)、`--`(自减)。#### 实现方式对比
| 方式         | 语法示例                          | 说明                                  |
|--------------|-----------------------------------|---------------------------------------|
| `expr`       | `val=`expr 2 + 2``                | 运算符两边必须有空格,用反引号``包裹  |
| `$(( ))`     | `val=$((2+2))`                    | 支持运算符无空格,语法简洁            |
| `$[ ]`       | `val=$[2+2]`                      | 与`$(( ))`类似,兼容性稍差            |
| `let`        | `let val=2+2`                     | 直接计算,无需`$`引用变量            |#### 实例:计算1-10的累加和
```bash
#!/bin/bash
sum=0
for ((i=1; i<=10; i++)); dosum=$((sum + i))  # 或 sum=$[sum+i]
done
echo "1-10累加和:$sum"  # 输出 55

2.2 关系运算符:判断数值大小

关系运算符仅支持整数,返回true(0)或false(非0),常用于条件判断。

运算符含义示例(a=10b=20
-eq等于[ $a -eq $b ] → false
-ne不等于[ $a -ne $b ] → true
-gt大于[ $a -gt $b ] → false
-lt小于[ $a -lt $b ] → true
-ge大于等于[ $a -ge $b ] → false
-le小于等于[ $a -le $b ] → true
实例:比较两个参数大小
#!/bin/bash
a=$1
b=$2
if [ $a -gt $b ]; thenecho "$a > $b"
elif [ $a -lt $b ]; thenecho "$a < $b"
elseecho "$a == $b"
fi

执行:./compare.sh 15 20 → 输出 15 < 20

2.3 逻辑运算符:组合条件判断

用于将多个条件组合,常见有两种语法(注意场景区别):

逻辑关系if语句中语法直接计算语法示例(a=10
与(and)-a&&[ $a -gt 5 -a $a -lt 15 ] → true
或(or)-o`
非(not)!![ ! $a -eq 5 ] → true
实例:判断数值是否在指定范围
#!/bin/bash
num=$1
if [ $num -ge 0 -a $num -le 100 ]; thenecho "$num 在 0-100 范围内"
elseecho "$num 超出范围"
fi

2.4 文件测试运算符:判断文件属性

Shell脚本常需操作文件(如判断文件是否存在、是否可执行),文件测试运算符是核心工具:

运算符含义示例
-e文件/目录是否存在[ -e ./test.sh ]
-f是否为普通文件[ -f ./test.sh ]
-d是否为目录[ -d ./test_dir ]
-r是否可读[ -r ./test.sh ]
-w是否可写[ -w ./test.sh ]
-x是否可执行[ -x ./test.sh ]
-s文件是否非空(大小>0)[ -s ./test.sh ]
实例:检查脚本是否可执行
#!/bin/bash
file="./test.sh"
if [ -e $file ]; thenif [ -x $file ]; thenecho "$file 可执行,开始运行..."./$fileelseecho "$file 不可执行,添加执行权限..."chmod +x $filefi
elseecho "$file 不存在!"
fi

三、Shell流程控制:控制脚本执行逻辑

默认情况下,Shell脚本按“从上到下、逐行执行”的顺序运行。流程控制语句可改变执行顺序,分为选择结构(if、case)和循环结构(for、while)。

3.1 选择结构:根据条件执行不同代码

1. if语句:单支、双支、多支判断
  • 单支if:条件成立则执行,否则不执行;

    if [ 条件 ]; then代码块
    fi
    
  • 双支if:条件成立执行代码1,否则执行代码2;

    if [ 条件 ]; then代码块1
    else代码块2
    fi
    
  • 多支if:多条件判断,匹配第一个成立的条件;

    if [ 条件1 ]; then代码块1
    elif [ 条件2 ]; then代码块2
    else默认代码块
    fi
    
实例:根据分数判断等级
#!/bin/bash
score=$1
if [ $score -ge 90 ]; thenecho "优秀"
elif [ $score -ge 80 ]; thenecho "良好"
elif [ $score -ge 60 ]; thenecho "及格"
elseecho "不及格"
fi

执行:./grade.sh 85 → 输出 良好

2. case语句:多值匹配判断

当需要匹配“固定的多个值”时(如菜单选择),caseif-elif更简洁,语法如下:

case $变量 in模式1)代码块1;;  # 结束当前模式模式2)代码块2;;*)  # 默认模式(无匹配时执行)默认代码块;;
esac  # case的反写,标志结束
实例:简单菜单交互
#!/bin/bash
echo "请选择操作:1.查看日期 2.查看目录 3.退出"
read choice  # 读取用户输入
case $choice in1)date;;2)ls;;3)echo "退出程序"exit 0  # 退出脚本;;*)echo "无效选择";;
esac

四、综合实例:Shell脚本实战

结合上述知识点,编写一个“批量文件重命名”脚本:需求是将当前目录下所有.txt文件重命名为file_1.txtfile_2.txt

#!/bin/bash
# 批量重命名.txt文件
count=1  # 计数器,用于文件名编号# 遍历当前目录下的.txt文件
for file in *.txt; do# 判断是否为普通文件(避免目录干扰)if [ -f $file ]; then# 重命名文件mv $file "file_$count.txt"echo "已重命名:$file → file_$count.txt"count=$((count + 1))  # 计数器自增fi
doneecho "重命名完成,共处理 $((count-1)) 个文件"

五、总结

Shell编程的核心是“通过参数传递实现灵活性、通过运算符实现计算判断、通过流程控制实现逻辑跳转”。掌握本文的三大知识点后,你可以:

  1. 编写支持命令行参数的脚本;
  2. 实现数值计算、文件判断等核心功能;
  3. 用流程控制语句处理复杂逻辑(如批量任务、交互菜单)。

建议从“小脚本”开始练习(如文件备份、日志清理),逐步积累实战经验,最终实现Shell自动化运维的目标!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95162.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95162.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95162.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用 Kotlin 在 Android 手机开发一个应用程序获取网络时间

使用 NTP 协议获取网络时间在 build.gradle 文件中添加以下依赖&#xff1a;implementation commons-net:commons-net:3.6创建 NTP 时间获取工具类&#xff1a;import org.apache.commons.net.ntp.NTPUDPClient import org.apache.commons.net.ntp.TimeInfo import java.net.In…

python智慧交通数据分析可视化系统 车流实时检测分析 深度学习 车流量实时检测跟踪 轨迹跟踪 毕业设计✅

博主介绍&#xff1a;✌全网粉丝50W&#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室&#xff0c;专注于计算机相关专业项目实战6年之久&#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力&#xff0c;已帮助成千上万的学生顺利毕业&#xff0c;…

计算机视觉第一课opencv(四)保姆级教学

目录 简介 一、轮廓检测 1.查找轮廓的API 2.代码分析 2.1.图像二值化处理 2.2轮廓检测 2.3轮廓绘制 2.4轮廓面积计算 2.5轮廓周长计算 2.6筛选特定面积的轮廓 2.7查找最大面积的轮廓 2.8绘制轮廓的外接圆 2.9绘制轮廓的外接矩形 二、轮廓的近似 三、模板匹配 简…

基于Vue2+elementUi实现树形 横向 合并 table不规则表格

1、实现效果 共N行&#xff0c;但是每一列对应的单元格列数固定&#xff0c;行数不固定2、实现方式说明&#xff1a;使用的是vue2 elementUI表格组件 js实现<template><div class"table-container" ><el-table height"100%" :span-metho…

深度学习在计算机视觉中的应用:对象检测

引言 对象检测是计算机视觉领域中的一项基础任务&#xff0c;目标是在图像或视频帧中识别和定位感兴趣的对象。随着深度学习技术的发展&#xff0c;对象检测的准确性和效率都有了显著提升。本文将详细介绍如何使用深度学习进行对象检测&#xff0c;并提供一个实践案例。 环境准…

node.js 安装步骤

在Node.js中安装包通常通过npm(Node Package Manager)来完成,这是Node.js的包管理工具。以下是安装Node.js和通过npm安装包的基本步骤: 1. 安装Node.js 方法一:使用nvm(Node Version Manager) 推荐使用nvm来安装Node.js,因为它允许你安装多个Node.js版本,并轻松地在…

面试-故障案例解析

一、NFS故障&#xff0c;造成系统cpu使用率低而负载极高。故障概述: 公司使用NFS为web节点提供共享存储服务,某一天下午发现web节点CPU使用率低,而负载极高.登录web节点服务器排查发现后段NFS服务器故障. 影响范围: 网站看不到图片了。 处理流程: 通过ssh登录NFS服务…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(一)

摘要: 随着高通量测序、医学影像和电子病历等生物医学数据的爆炸式增长,对高效、可靠、可扩展的计算工具需求日益迫切。Go语言凭借其原生并发模型、卓越的性能、简洁的语法和强大的标准库,在生物医学信息学领域展现出独特优势。本文以“生物医学Go编程探析”为主题,通过三个…

针对 “TCP 连接建立阶段” 的攻击

针对 “TCP 连接建立阶段” 的攻击一、定义二、共性防御思路三、攻击手段3.1、SYN 洪水攻击&#xff08;SYN Flood&#xff09;3.2、Land 攻击&#xff08;Land Attack&#xff09;一、定义 什么是针对 “TCP 连接建立阶段” 的攻击&#xff1f;核心特征是利用 TCP “三次握手…

聊一聊 单体分布式 和 微服务分布式

微服务 与 单体架构对比维度单体架构微服务架构​​架构本质​​一个单一的、功能齐全的应用程序一组​​小型、独立​​的服务集合​​开发​​团队工作在同一个代码库&#xff0c;易产生冲突。技术栈统一。每个服务可以由​​ 独立的小团队 ​​负责&#xff0c;允许使用​​…

【C++八股文】计算机网络篇

网络协议核心知识点详解 TCP头部结构 TCP头部包含多个关键字段&#xff0c;每个字段都有其特定作用&#xff1a; 16位源端口&#xff1a;标识发送方应用程序的端口号16位目的端口&#xff1a;标识接收方应用程序的端口号32位序号&#xff1a;保证数据包有序传输的唯一标识32…

小迪Web自用笔记7

游戏一般不走http https协议&#xff0c;一般的抓包工具抓不到。科来&#xff0c;这个工具是从网卡抓包。你一旦打怪数据就会多起来↓但不是很专业。可以抓到https。wep↑这个西东是全部协议都做流量包&#xff0c;你不知道他是从哪儿来的&#xff0c;他全都抓&#xff08;专业…

现代 Linux 发行版为何忽略Shell脚本的SUID位?

在现代Linux系统中&#xff0c;为Shell脚本设置 SUID&#xff08;Set User ID&#xff09; 权限位几乎是无效的。这个看似简单的现象背后&#xff0c;是Linux内核设计者们在安全与便利性之间做出的一个至关重要的历史性抉择。要彻底理解这一点&#xff0c;我们需要深入到内核层…

Qt节点编辑器设计与实现:动态编辑与任务流可视化(一)

文章目录一、项目概述二、整体架构&#xff1a;模型-视图分离的设计哲学1. 模型层&#xff1a;数据与业务逻辑的核心2. 视图层&#xff1a;图形渲染与用户交互3. 交互层&#xff1a;连接模型与视图的桥梁三、核心模块解析1. 样式管理系统&#xff1a;视觉表现的基石2. 图形数据…

MySQL常见报错分析及解决方案总结(4)---ERROR 1040(00000):Too many connections

报错信息&#xff1a;ERROR 1040(00000):Too many comnections异常效果&#xff1a;原因分析&#xff1a;“ERROR 1040 (00000): Too many connections” 是 MySQL 数据库最常见的连接数超限错误&#xff0c;本质是 “当前试图连接数据库的客户端数量&#xff0c;超过了 MySQL …

GRPO(组相对策略优化):大模型强化学习的高效进化

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; ✨ 1. GRPO概述&#xff1a;重新定义大模型强化学习效率 GRPO&#x…

【Canvas与戳记】蓝底黄面十六角Premium Quality戳记

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>蓝底黄面十六角Premium Quality戳记 Draft1</title><style ty…

深度学习:洞察发展趋势,展望未来蓝图

在科技飞速发展的当下&#xff0c;深度学习作为人工智能领域的璀璨明星&#xff0c;正以前所未有的速度重塑着各个行业的格局。从日常使用的智能语音助手&#xff0c;到医疗领域精准的疾病诊断&#xff0c;再到自动驾驶汽车对复杂路况的实时感知与决策&#xff0c;深度学习无处…

基于Docker部署的Teable应用

简介Teable 是一款高性能多维表格本地化的解决方案&#xff0c;通过无代码方式快速构建业务管理系统&#xff0c;支持私有部署和精细权限管理。对于个人或者小团队使用&#xff0c;可以避免昂贵的集成软件带来的成本压力。特点Excel 式任意拖拽选区编辑支持双向关联&#xff0c…

Java项目实现【记录系统操作日志】功能

✨ 哈喽&#xff0c;屏幕前的每一位开发者朋友&#xff0c;你们好呀&#xff01;✨​ 当你点开这篇文章时&#xff0c;或许正对着 IDE 里闪烁的光标发呆&#xff0c;或许刚解决一个卡了三天的 bug&#xff0c;正端着咖啡松口气 —— 不管此刻的你在经历什么&#xff0c;都想先和…