当前位置: 首页 > news >正文

Shell 脚本编程规范与变量

目录

一、Shell 简介与作用

1.1 什么是 Shell?

1.2 Shell 的作用

1.3 常见的 Shell 解释器

二、Shell 脚本基础

2.1 什么是 Shell 脚本?

2.2 脚本结构

2.3 创建脚本步骤

2.4 执行方式

三、变量

3.1 变量定义与使用

3.2 只读变量与删除变量

3.3 变量类型

四、字符串操作

4.1 字符串定义

4.2 字符串操作

五、参数传递

5.1 接收参数

5.2 特殊变量

六、运算符

6.1 算术运算

6.2 关系运算符

6.3 逻辑运算符

6.4 字符串运算符 

6.5 文件测试运算符ss

七、流程控制

7.1 if 语句

7.2 for 循环

7.3 while 循环

7.4 case 语句

八、函数

8.1 定义与调用

8.2 返回值

九、数组

9.1 定义与访问

9.2 遍历数组

十、文件包含

十一、实战案例:猜数字游戏


一、Shell 简介与作用

1.1 什么是 Shell?
  • Shell 是一个命令解释器,位于操作系统最外层,负责与用户交互。

  • 它将用户输入的命令翻译成系统可执行的二进制指令,并将结果返回给用户。

1.2 Shell 的作用
  • 解释用户输入的命令,传递给内核执行。

  • 支持多种解释器,如 bashshzshcsh 等。

  • 系统默认 Shell 通常为 /bin/bash,可通过 /etc/passwd 查看用户使用的 Shell。

简单说就是

shell是Linux系统中的命令解释器

负责接受用户的指令并将其传递给内核执行,最终输出结果

1.3 常见的 Shell 解释器

第一行#!/bin/bash

/bin/sh      # bash 的软链接
/bin/bash    # 默认 Shell
/bin/tcsh    # csh 增强版
/bin/csh     # 已被 bash 替代
/usr/bin/nologin # 禁止登录的 Shell

二、Shell 脚本基础

2.1 什么是 Shell 脚本?
  • 将一系列命令和语句保存在一个文件中,按顺序执行。

  • 不需要编译,是解释型语言。

2.2 脚本结构
#!/bin/bash          # 第一行 默认解释器
# 以#开头 注释信息不会执行里面内容           
2.3 创建脚本步骤
vim 123.sh           #创建一个包含命令语句 后期加上控制结构的shell文件
chmod +x 123.sh   # 添加执行权限
./123.sh          # 检查脚本语法是否有错误 执行
2.4 执行方式
chmod +x 123.sh   # 添加执行权限
./123.sh          # 当前路径执行
/etc/23.sh        # 绝对路径执行 
bash 123.sh       # 使用 bash 解释器执行
source 123.sh     # 在当前 Shell 中执行

示例

一个程序的基本组成:

1. 变量

2. 数据类型

3. 运算符号

4. 流程控制语句(默认:程序是按照从上向下依次执行)

5. 数组

6. 函数(另一个名字:方法)

三、变量

3.1 变量定义与使用

变量的语法: 变量名=值

name="Tom"          # 定义变量
echo $name          # 使用变量
echo ${name}        # 明确变量边界

注意: 等号两边不能有空格 ,同时变量名的命名须遵循如下规则:

首个字符必须为字母( a-z, A-Z)

中间不能有空格,可以使用下划线( _)

不能使用标点符号

不能使用 bash 里的关键字(可用 help 命令查看保留关键字)

花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。

3.2 只读变量与删除变量
readonly name="Tom" # 只读变量  
unset name          # 删除变量(不能删除只读变量)

已定义的变量,可以被重新定义。

3.3 变量类型
  • 局部变量(本地变量):仅在当前 Shell 中有效。

  • 全局变量(环境变量):所有程序都可访问,如 PATHHOME。可以用过 set 命令查看当前环境变量。


四、字符串操作

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没 啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不 用引号。

4.1 字符串定义

str1='Hello'        # 单引号,原样输出 变量是无效
str2="Hello $name"  # 双引号,可解析变量 可以出现转义字符\

4.2 字符串操作

${字符串:索引:长度}

echo ${#hello}        # 输出字符串长度
echo ${hello:2}       # 截取子串 第二个后的所有
echo ${hello:2:4}     # 截取子串 第二个后的四个
expr index "$hello" "l" # 查找字符位置 或者
echo `expr index "$hello" l` # 查找字符位置

注意:当字符串中有空格时,空格也算一个字符存在(字符串是从0开始计 算)

以上脚本中 ` 是反引号(Esc下面的),而不是单引号 '

查找字符串是 从1开始计算位置

expr是以单个字符查找 如果中间有重复字母会显示前面字符的索引


五、参数传递

5.1 接收参数

运行shell程序时传递参数: ./shell程序 参数a1 参数2 参数n

shell程序中接收参数的方式:$n n代表一个数字,$1表示第一个参数

echo $0             # 查看当前脚本名
echo $1             # 第一个参数
echo $#             # 参数个数
echo $*             # 所有参数(字符串)
echo $@             # 所有参数(列表)
echo $$             #当前脚本进程id
echo $!             #后台运行最后一个运行进程id
echo $?             #查看上一个命令是否正确

5.2 特殊变量

变量

含义

$#

传递到脚本的参数个数

 $*

以一个单字符串显示向所有脚本传递的参数

$$

脚本运行的当前进程ID号

$!

后台运行的最后一个进程ID号

$@与$*相同 但使用时加引号 并在引号中返回每个参数

$?

显示最后命令的退出状态  0表示没有错误 其他数值表示有错

5.2 $* 和 $@ 的区别

相同点: 都表示传递给脚本的所有参数。

不同点:

不被" "包含时:$*和$@都以$1 $2… $n 的形式组成参数列表

被 " " 包含时:

*"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式组成一个 整串

"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表

“$*” 输出: “1 2 3”       

“$@” 输出: 1 2 3 当作一个完整的参数

六、运算符

原生 /bin/bash 不支持简单的数学运算,但是可以通过其他命令来实现, 例如:expr

expr 是一款表达式计算工具,使用它能完成表达式的/求值操作。

6.1 算术运算
expr 2 '*' 3        # 乘除
expr 2 \* 3         # 乘除
expr 5 % 2          # 取余数
val=`expr 2 + 3`    # 使用 expr
val=$((2 + 2))      # 使用 $(())
val=$[2 + 2]        # 使用 $[]

注意: 1、运算数和运算符之间要有空格。例如: 2+2 是不能运算的,必须写成 2 + 2

2、完整的表达式要被`符号包含,注意不是单引号,在 Esc 键下边

6.2 关系运算符

注意:关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

数字的关系运算符: >   >=   <   <=   !=   ==

运算符含义

-eq

等于

-ne

不等于

-gt

大于

-lt

小于
-le小于等于
-ge大于等于
6.3 逻辑运算符

[ $a > 0 && $b > 10 ]  # and
[ $a > 0 || $b > 10 ]  # or
6.4 字符串运算符 

字符串

运算符含义
-n STRING字符串长度不为零 (非空字符串)
-z STRING字符串长度为0(空字符串)
=判断两个字符串是否一样

!=

判断两个字符串是否不一样
6.5 文件测试运算符ss
运算符号含义示例
-f存在且是普通文件[ -f 文件路径 ]
-d存在且是目录[ -d 目录路径 ]
-s文件不为空[ -s 文件路径 ]
-e文件存在[ -e 文件路径 ]
-r文件存在并且可读[ -r 文件路径 ]
-w文件存在并且可写[ -w 文件路径 ]
-x文件存在并且可执行[ -x 文件路径 ]

七、流程控制

任何程序都有默认的执行流程,通常是 从上向下逐行依次执行

7.1 if 语句
if [ condition ]; thencommands
elif [ condition ]; thencommands
elsecommands
fi
7.2 for 循环

bash

for i in 1 2 3; doecho $i
donefor ((i=0; i<10; i++)); doecho $i
done
7.3 while 循环

bash

while [ condition ]; docommands
donewhile true; docommands
done
7.4 case 语句

bash

case $var inpattern1)commands;;pattern2)commands;;*)commands;;
esac

八、函数

8.1 定义与调用

bash

function myfunc() {echo "Hello $1"
}
myfunc "Tom"
8.2 返回值

bash

function add() {return $(($1 + $2))
}
add 3 5
echo $?          # 输出 8

九、数组

9.1 定义与访问

bash

arr=("A" "B" "C")
echo ${arr[0]}    # 输出 A
echo ${arr[@]}    # 输出所有元素
echo ${#arr[@]}   # 输出数组长度
9.2 遍历数组

bash

for i in "${arr[@]}"; doecho $i
done

十、文件包含

bash

source other.sh   # 包含其他脚本
. other.sh        # 同上

十一、实战案例:猜数字游戏

bash

#!/bin/bash
num=$((RANDOM % 100 + 1))
while true; doread -p "猜一个 1-100 的数字: " guessif [ $guess -eq $num ]; thenecho "恭喜,猜对了!"exitelif [ $guess -gt $num ]; thenecho "猜大了"elseecho "猜小了"fi
done
http://www.dtcms.com/a/355311.html

相关文章:

  • [调试][实现][原理]用Golang实现建议断点调试器
  • 裸金属服务器与虚拟机、物理机的核心差异是什么?
  • 鸿蒙Harmony-从零开始构建类似于安卓GreenDao的ORM数据库(二)
  • Kea DHCP高危漏洞CVE-2025-40779:单个数据包即可导致服务器崩溃
  • 获取小红书某个用户列表
  • Swift 解法详解 LeetCode 365:水壶问题
  • day083-Filebeat数据采集案例与Kibana可视化应用
  • Leetcode 494. 目标和 动态规划-01背包
  • 【踩坑记录】SpringBoot 项目报 Communications link failure 的解决方法
  • 数据结构初阶:详解双链表
  • 在angular20中使用monaco-editor
  • LLM Agent工具设计规范总结
  • Python 实现归并排序:从原理到代码
  • Ansys Electronics Desktop 2025 R2 软件界面介绍
  • open webui源码分析10-四个特征之搜索
  • 系统架构师-软件工程
  • 前端响应式设计
  • 推荐系统王树森(五)重排多样性提升
  • 银河麒麟桌面操作系统:为什么不让root直接登录图形界面?以及如何安全地解决这个问题
  • 英伟达营收和利润均超出市场预期,但盘后一度跌超5%
  • Groovy语法入门
  • [光学原理与应用-321]:皮秒深紫外激光器产品不同阶段使用的工具软件、对应的输出文件
  • 客户案例 | 国际知名内衣品牌x甄知科技,领航IT服务新征程
  • linux 网络:并发服务器及IO多路复用
  • 开发避坑指南(42):Vue3 element ui el-table单选实现方案
  • HTML静态页面实现材积计算器和材积表生成器
  • 动手学深度学习(pytorch版):第七章节—现代卷积神经网络(5)批量规范化
  • 吴炳锡:AI 时代下的湖仓一体化平台建设的思考
  • 从枯燥C++到趣味音乐:我的Windows系统底层探索之旅
  • 公共字段自动填充