linux shell 脚本语言教程(超详细!)

在这里插入图片描述

Shell 编程详细指南

什么是 Shell?

Shell 是用户与操作系统内核之间的接口,允许用户通过命令行输入来控制操作系统。它充当命令解释器,读取用户输入的命令并执行相应的操作。Shell 提供了强大的脚本编程能力,可以自动化许多任务。常见的 Shell 有 Bash(Bourne Again Shell)、Zsh(Z Shell)、Ksh(Korn Shell)等。

什么是 Shell 脚本?

Shell 脚本是一种编程语言脚本,用于在 Unix/Linux 操作系统上执行命令。它是一系列命令的集合,通常保存在一个文件中,可以通过运行脚本文件来执行这些命令。

1. 注释

单行注释

在 Shell 脚本中,注释是通过 # 字符来实现的。任何在 # 后面的内容都会被忽略,不会被执行。

# 这是一个单行注释
# echo "Hello, World!" 

文章下面讲的是shell是Bash的语法, 所有语法可以直接在终端使用, 也可以写在一个 .bash.sh 的文件中, 然后通过 ./filename 来执行。(要想执行, 需要给文件可执行的权限, 下面会讲到)

文件开头先写上下面内容,

#!/bin/bash

#!/bin/bash 是一种称为 “shebang” 或 “hashbang” 的特殊注释,用于指定脚本的解释器。

作用

  1. 指定解释器#!/bin/bash 告诉操作系统这个脚本应该由 /bin/bash 程序来解释执行。/bin/bash 是 Bash(Bourne Again Shell)的路径。

  2. 执行权限:当你在 Unix/Linux 系统中运行一个脚本时,操作系统会根据这个 shebang 行来决定用哪个解释器来执行脚本内容。#!/bin/bash 使得脚本能够以 Bash 语言执行,即使脚本的扩展名不是 .sh

2. 变量

变量定义与使用

在 Shell 中,变量的定义不需要使用数据类型。可以直接用 = 号赋值,不要在 = 号两边加空格。变量的值可以通过 $ 符号来引用。

my_var="Hello, World!"
echo $my_var

变量命名规则

  • 变量名只能包含字母、数字和下划线。
  • 变量名不能以数字开头。
  • 变量名通常使用大写字母以提高可读性(不是强制要求)。

变量类型

  1. 字符串变量
name="John Doe"
echo "Hello, $name"
  1. 整数变量
number=42
echo "The number is $number"
数组

数组赋值

arr=(value1 value2 value3)

读取数组元素

echo ${arr[1]}
变量操作

变量替换

变量替换是指将变量的值插入到字符串中。

echo "My name is ${name}."

只读变量

定义只读变量后,其值不能被修改。

readonly val="value"
val="new_value" # 这将会报错

3. 环境变量

环境变量是可以在整个系统中使用的变量。它们通常在 Shell 会话开始时定义,可以影响系统的行为和操作。常见的环境变量有 PATHHOMEUSER 等。

定义和导出环境变量

使用 export 命令可以将变量设置为环境变量。

export MY_ENV_VAR="value"
查看环境变量

使用 printenvenv 命令可以查看当前所有环境变量。

printenv
env

4. 常用 Shell 变量

  • $0:当前脚本的文件名。
  • $1, $2, …:传递给脚本或函数的参数。
  • $#:传递给脚本或函数的参数个数。
  • $@:传递给脚本或函数的所有参数。
  • $?:上个命令的退出状态。
  • $$:当前 Shell 进程的 PID。
  • $!:后台运行的最后一个进程的 PID。

5. 输入输出

read 命令

read 命令用于从标准输入读取一行输入,并将其分配给一个或多个变量。

基本用法
echo "Enter your name:"
read name
echo "Hello, $name!"
使用选项
  • -p 提示符
  • -s 隐藏输入(常用于密码)
  • -t 设置超时
  • -n 限制输入字符数
read -p "Enter your username: " username
read -s -p "Enter your password: " password
echo
echo "Username: $username"
echo 命令

echo 命令用于输出字符串到标准输出。

基本用法
echo "Hello, World!"
使用选项
  • -n 不换行
  • -e 解析反斜杠转义字符
echo -n "Hello, "
echo "World!"
echo -e "Line1\nLine2\nLine3"
printf 命令

printf 命令用于格式化输出,类似于 C 语言中的 printf 函数。

printf "Hello, %s!\n" "World"
常见格式说明符
  • %s 字符串
  • %d 十进制整数
  • %f 浮点数
  • %x 十六进制数
name="John"
age=25
printf "Name: %s, Age: %d\n" "$name" "$age"

6. 条件判断

判断语句
if 语句
if [ condition ]; then# statements
elif [ condition ]; then# statements
else# statements
fi

样例:

#!/bin/bashnumber=5# gt lt 分别是 > 和 <
if [ $number -gt 0 ]; thenecho "The number is positive."
elif [ $number -lt 0 ]; thenecho "The number is negative."
elseecho "The number is zero."
fi
case 语句
case "$variable" inpattern1)# statements;;pattern2)# statements;;*)# default statements;;
esac

样例:

#!/bin/bash
echo "Enter a single character (a-g):"
read charcase "$char" ina)echo "Monday";;b)echo "Tuesday";;c)echo "Wednesday";;d)echo "Thursday";;e)echo "Friday";;f)echo "Saturday";;g)echo "Sunday";;*)echo "Invalid input";;
esac
test 命令

test 命令用于条件判断,常与逻辑运算符结合使用。

文件测试
  • -e 文件存在
  • -f 文件是普通文件
  • -d 文件是目录
if test -e /etc/passwd; thenecho "/etc/passwd exists."
fi
字符串测试
  • -z 字符串为空
  • -n 字符串非空
  • = 字符串相等
  • != 字符串不相等
if test -z "$name"; thenecho "Name is empty."
fi
数值测试
  • -eq 等于
  • -ne 不等于
  • -gt 大于
  • -lt 小于
  • -ge 大于或等于
  • -le 小于或等于
if test $age -gt 20; thenecho "Age is greater than 20."
fi

7. 循环语句

for 循环
for var in list; do# statements
done
for i in {1..5}; doecho "Number: $i"
done
while 循环
while [ condition ]; do# statements
done
counter=1
while [ $counter -le 5 ]; doecho "Counter: $counter"counter=$((counter + 1))
done
until 循环
until [ condition ]; do# statements
done
counter=1
until [ $counter -gt 5]; doecho "Counter: $counter"counter=$((counter + 1))
done

8. 函数

Shell 函数用于封装代码块,以便多次调用。

定义函数
function_name() {# statements
}
greet() {echo "Hello, $1!"
}greet "World"
带返回值的函数
add() {result=$(( $1 + $2 ))return $result
}add 2 3
echo "Sum: $?"

综合示例

#!/bin/bash# 函数定义
print_menu() {echo "1. Say Hello"echo "2. Display Date"echo "3. Exit"
}# 主程序
while true; doprint_menuread -p "Enter your choice: " choicecase $choice in1)read -p "Enter your name: " nameecho "Hello, $name!";;2)current_date=$(date)echo "Current date and time: $current_date";;3)echo "Goodbye!"break;;*)echo "Invalid choice, please try again.";;esac
done

结论

上述内容涵盖了 Shell 脚本编程中的基础部分,包括输入输出、变量和函数、条件判断和循环等。通过理解和掌握这些内容,你可以编写功能强大的 Shell 脚本来

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

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

相关文章

【javax maven项目缺少_Maven的依赖管理 引入依赖】

javax maven项目缺少_Maven的依赖管理 引入依赖 Maven的依赖管理 - 引入依赖依赖管理(引入依赖)导入依赖 https://blog.csdn.net/weixin_28932089/article/details/112381468 Maven的依赖管理 - 引入依赖 依赖管理(引入依赖) 能够掌握依赖引入的配置方式 导入依赖 导入依赖练…

银行客户贷款行为数据挖掘与分析

#1024程序员节 | 征文# 在新时代下&#xff0c;消费者的需求结构、内容与方式发生巨大改变&#xff0c;企业要想获取更多竞争优势&#xff0c;需要借助大数据技术持续创新。本文分析了传统商业银行面临的挑战&#xff0c;并基于knn、逻辑回归、人工神经网络三种算法&#xff0…

重构案例:将纯HTML/JS项目迁移到Webpack

我们已经了解了许多关于 Webpack 的知识&#xff0c;但要完全熟练掌握它并非易事。一个很好的学习方法是通过实际项目练习。当我们对 Webpack 的配置有了足够的理解后&#xff0c;就可以尝试重构一些项目。本次我选择了一个纯HTML/JS的PC项目进行重构&#xff0c;项目位于 GitH…

[旧日谈]高清画面撕裂问题考

背景 无边框透明背景透明的窗口&#xff0c;在随着缩放比例非整数倍数放大时的画面发生了露底、撕裂问题。 当我们在使用Qt开发的时候&#xff0c;遇到了一个结构性问题。因为我们的软件是自己做的&#xff0c;所以要自己定义标题栏&#xff0c;所以我们设置了软件为FrameLess…

mono源码交叉编译 linux arm arm64全过程

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

mysql——事务详解

一、事务定义 事务&#xff1a;事务是一个最小的不可在分的工作单元&#xff1b;通常一个事务对应一个完整的业务(例如银行账户转账业务&#xff0c;该业务是一个最小的工作单元)事务保证多条sql语句要么同时执行成功&#xff0c;要么同时执行失败一个完整的业务需要批量的DML…

移除Microsoft Edge浏览器“由你的组织管理“提示的方法

背景&#xff1a; 点击Microsoft Edge浏览器右上角的按钮有时候会出现提示“由你的组织管理”。但实际上自己的电脑并没有被公司或其他企业管理。 解决方案&#xff1a; 提示&#xff1a;修改注册表如果操作不当会影响电脑&#xff0c;请提前备份注册表&#xff01;&#xff…

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发&#xff0c;主要涵盖以下几个方面&#xff1a; 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

Qt之QCamera的简单使用

文章目录 一、相机操作相关示例1.摄像头操作内容使用示例2.摄像头信息展示使用示例3.摄像头设置切换、预览操作示例 二、相机使用个人操作理解1.相机类支持信息获取2.相机类曝光、焦点、图像处理控制信息获取3.快速启动相机设置&#xff08;各个设备处于理想状态&#xff09; 三…

地平线x5下运行yolo11s-seg模型

经过地瓜机器人工作人员&#xff08;感谢吴超同学&#xff09;的及时技术支持&#xff0c;整体比较顺利的跑起来了yolo11s-seg分割模型。将一些经验记录下来&#xff1a; 首先下载使用docker镜像&#xff1a; https://developer.d-robotics.cc/forumDetail/228559182180396619 …

linux驱动—注册总线分析

成功地在直接注册了一个总线&#xff0c;并且在总线目录下创建了属性文件&#xff0c;什么会在 sys/bus 目录下生成 mybus,目录以及对应的 devices,drivers, drivers_autoprobe,drivers_probe&#xff0c;uevent目录和属性呢? /sys,目录下的目录都对应一个kobject&#xff0c;…

如何成为录屏高手?2024年全新录屏工具梳理,你选对了吗?

如何录屏&#xff1f;录屏现在对我们来说太重要了&#xff0c;不管是做教学视频、演示文稿&#xff0c;还是录游戏或者教别人怎么用软件&#xff0c;都离不开录屏工具。但是市面上录屏软件一大堆&#xff0c;挑个适合自己的真不容易。今天&#xff0c;我就来给你介绍几款特别火…

知识图谱解码:AI 如何构建知识网络

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共23款…

凸轮应用实例(带进料装置的伺服压机控制)

凸轮表凸轮关系曲线建立 博途S7-1500T PLC曲柄连杆模型仿真(电子凸轮完整配置+SCL源代码)-CSDN博客文章浏览阅读4次。这篇博客介绍了曲柄连杆机构的位移与曲柄转动角度关系,通过MATLAB进行计算和Simulink验证,并提供博途SCL源代码。文章链接提供了详细的曲柄连杆数学模型分析…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available&#xff08;基本可用&#xff09;2_Soft State&#xff08;软状态&#xff09;3_Eventually Consistent&#xff08;最终一致性&#xff09;4_总结 1、理论基础 在计算机…

WASM 使用说明23事(RUST实现)

文章目录 1. wasm是什么1.1 chatgpt定义如下:1.2 wasm关键特性&#xff1a; 2. wasm demo2.1 cargo 创建项目2.2 编写code2.3 安装wasm-pack2.4 编译 3.1 html页面引用wasm代码&#xff08;js引用&#xff09;3.2 访问页面4 导入js function4.1 编写lib.rs文件&#xff0c;内容…

【SpringCloud】06-Sentinel

1. 雪崩问题 一个微服务出现问题导致一系列微服务都不可以正常工作。 服务保护方案&#xff1a; 请求限流。线程隔离。 服务熔断 2. Sentinel 启动Sentinel java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -Dproject.namesentinel-dashboard -ja…

【已解决】C# NPOI如何在Excel文本中增加下拉框

前言 上图&#xff01; 解决方法 直接上代码&#xff01;&#xff01;&#xff01;&#xff01;综合了各个大佬的自己修改了一下&#xff01;可以直接规定在任意单元格进行设置。 核心代码方法块 #region Excel增加下拉框/// <summary>/// 增加下拉框选项/// </s…

centeros7 编译ffmpeg

使用yum安装的路似乎已经堵住了&#xff0c;请求的镜像全是404或503 1.打开终端并使用yum安装EPEL存储库(Extra Packages for Enterprise Linux)&#xff1a;sudo yum install epel-release2.接下来&#xff0c;使用以下命令来安装FFmpeg&#xff1a;sudo yum install ffmpeg …

有关spring,springboot项目的知识点

文章目录 1.Spring基本介绍1.1Spring官网1.2Spring的发展 2.SpringBoot2.1SpringBoot快速入门2.1.1创建SpringBoot工程,并勾选web开发相关依赖2.1.2定义HelloController类,并添加方法helllo,且添加注解2.1.3运行测试 3.HTTP协议3.1HTTP协议的概念3.1.1HTTP的特点 3.2HTTP-请求协…