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

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.xdnf.cn/news/19100.html

相关文章:

  • Spring Boot + KingbaseES 连接池实战
  • 【C#/Cpp】CLR项目搭建的内联和托管两选项
  • 基于uni-app的iOS应用上架,从打包到分发的全流程
  • 大模型推荐系统新标杆!EGA-V2端到端大模型驱动推荐系统
  • Ansys Electronics Desktop 2025 R2 软件界面介绍
  • Java线程池深度解析:从原理到实战的完整指南
  • orbslam2语义分割
  • 工业级TF卡NAND+北京君正+Rk瑞芯微的应用
  • 人工智能-python-深度学习-过拟合与欠拟合:概念、判断与解决方法
  • 【Bluedroid】A2DP Source设备音频数据读取机制分析(btif_a2dp_source_read_callback)
  • Solidity合约编程基础知识
  • Java 多线程环境下的全局变量缓存实践指南
  • jwt原理及Java中实现
  • Ckman部署clickhouse
  • 5.2 I/O软件
  • 横扫SQL面试——流量与转化率分类
  • C++《哈希表》
  • Unity游戏打包——iOS打包pod的重装和使用
  • Servlet 注解:简化配置的完整指南
  • 大模型微调示例四之Llama-Factory-DPO
  • 若依cloud集训总结
  • 汉字这颗穿越时空的智慧之光,在未来绽放出更加耀眼的光芒
  • 深入解析Java并发编程与单例模式
  • 文件系统挂载详细分析(《图解Linux内核》虚拟文件系统篇笔记三)
  • 神经网络为何能 “学习”?从神经元到深度学习模型的层级结构解析
  • 打破存储局限:CS 创世 SD NAND 如何优化瑞芯微(RK)与北京君正平台的贴片式 SD 卡性能
  • 【C++成长之旅】C++入门基础:从 Hello World 到命名空间与函数重载的系统学习
  • Bscan Bonding Chain
  • 印度尼西亚数据源 PHP 对接文档
  • Mysql——分库分表