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

Linux系统shell脚本(二)

一、Shell 中的 if 条件判断语句

基本语法结构

Shell 中的 if 语句用于根据条件执行不同的代码块,基本结构如下:

单分支

if [ 条件判断式 ];then命令
fi 或者if [ 条件判断式 ]then命令
fi

双分支

if [ 条件判断式 ]then命令
else命令
fi

多分支

if [ 条件判断式1 ]then命令
elif [ 条件判断式2 ]then 命令
...
...
else命令
fi

二、Shell 字符串详解

字符串的表示方式

字符串(String)就是一系列字符的组合。字符串是Shell编程中最常用的数据类型之一

字符串可以由单引号''包围,也可以由""包围,也可以不用引号,三种方式的区别

  1. 单引号字符串

    • 任何字符都会原样输出
    • 变量引用无效
    • 不能包含单引号(即使转义也不行)
  2. 双引号字符串

    • 变量会被解析为对应的值
    • 可以包含转义的双引号
    • 保留字符串中的空格
  3. 无引号字符串

    • 变量会被解析
    • 不能包含空格
    • 空格会被视为分隔符
#!/bin/bash
n=74
str1=c.biancheng.net$n 
str2="shell \"Script\" $n"
str3='C语言中文网 $n'
echo $str1
echo $str2
echo $str3# 运行结果
c.biancheng.net74
shell "Script" 74
C语言中文网 $n

字符串长度获取

使用${#string}格式获取字符串长度:

name="Shell"
echo ${#name}  # 输出 5

字符串拼接

在 Shell 中无需运算符,直接拼接即可:

name="Shell"
version="5.1"
fullname="${name}${version}"  # 结果为"Shell5.1"
description="${name} version: ${version}"  # 结果为"Shell version: 5.1"#!/bin/bash
name="shell"
url="http://c.biancheng.net/shell/"
str1=$name$url #中间不能有空格
str1=$name":"$url
str2="$name $url" #如果被双引号包围,那么中间可以有空格,也可以出现别的字符串
str3="$name:$url" 
str4="${name}Script:${url}Index.html" #在变量后加上字符串,需要给变量名加上大括号

字符串截取

  1. 按位置截取

    • ${string:start:length}:从左边第 start 位开始截取 length 个字符
    • ${string:start}:从左边第 start 位开始截取到末尾
    • ${string:0-start:length}:从右边第 start 位开始截取 length 个字符
    • ${string:0-start}:从右边第 start 位开始截取到末尾
  2. 按字符截取

    • ${string#*chars}:从第一次出现 chars 的位置截取右边字符
    • ${string##*chars}:从最后一次出现 chars 的位置截取右边字符
    • ${string%chars*}:从第一次出现 chars 的位置截取左边字符
    • ${string%%chars*}:从最后一次出现 chars 的位置截取左边字符

格式化输出 printf

printf 命令用于格式化输出,语法:printf "格式" "参数1" "参数2"...

常用格式符:

  • %s:字符串
  • %d/%i:十进制整数
  • %f:浮点数(可指定保留小数位数,如%.2f
  • %%:表示 % 本身
  • 说明:%s中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字符宽,-表示左对齐

常用转义符:

  • \n:换行
  • \t:水平制表符
  • \r:回车

三、Shell脚本语言的运算

条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成测试过程,实现评估布尔声明,以便在条件性环境下进行执行。

  • 若真,则状态码变量$?返回0

  • 若假,则状态码变量$?返回1

语法格式说明适用场景注意事项
test <测试表达式>基础测试命令,兼容性强简单条件判断,需兼容老式 Shell表达式与test间必须有空格
[ <测试表达式> ]test命令的简化写法,POSIX 标准多数脚本场景,兼顾兼容性括号与表达式间必须有空格,不支持正则
[[ <测试表达式> ]]Bash 增强语法,功能更丰富复杂条件判断(如正则、模式匹配)仅支持 Bash,不兼容其他 Shell,支持&&/``
((<测试表达式>))整数专用测试语法纯整数比较场景仅支持整数,无需空格分隔,支持 C 风格运算符
  1. 文件测试:判断文件属性,如存在性、类型、权限等

    • -f file:判断是否为普通文件
    • -d dir:判断是否为目录
    • -e/-a path:判断路径是否存在 文件是否存在
    • -r file:判断文件是否可读
    • -w file:判断文件是否可写
    • -x file:判断文件是否可执行
  2. 数值比较:用于整数之间的比较

    • -eq:等于(equal)
    • -ne:不等于(not equal)
    • -gt:大于(greater than)
    • -lt:小于(less than)
    • -ge:大于等于(greater or equal)
    • -le:小于等于(less or equal)
  3. 字符串比较

    • == 或 =:字符串相等
    • !=:字符串不等
    • -z string:字符串长度为 0
    • -n string:字符串长度不为 0

关于()与 { }

( )和 { }都可以将多个命令组合再一次,批量执行,{ } 里的内容需要与两侧用空格隔开并在命令结尾加上;

  • ( )会开启子shell,并且list中变量赋值及内部命令执行后,将不再影响后续的环境

{ } 不会开启子shell,在当前shell中运行,会影响当前shell环境

4.7 使用read命令命令来接受输入

read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据

4.7.1 语法结构
read [option] [variables]
​
--options表示选项
​
--variables表示用来存储数据的变量,可以有一个,也可以有多个。
​
-- options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。
4.7.2 选项:
Option说明
-a array把读取的数据赋值给数组array,从下标0开始
-d delimiter把字符串delimiter指定读取结束的位置,而不是一个换行符(读取的数据不包括delimiter)
-e在获取用户输入的时候,对功能键进行编码转换,不会直接显示功能键对应的字符
-n num读取num个字符,而不是整行字符
-p prompt显示提示信息,提示内容为prompt
-r原样读取(Raw mode),不会把反斜杠字符解释为转义字符
-s静默模式(Silent mode),不会再屏幕上显示输入的字符。例如:输入密码
-t seconds设置超时时间,单位为秒。如果用户没能按时完成,返回一个非0的退出状态
-u fd使用文件描述符fd作为输入源,而不是标准输入,类似于重定向

http://www.xdnf.cn/news/19655.html

相关文章:

  • 【Python - 基础 - 工具】解决pycharm“No Python interpreter configured for the project”问题
  • 机器学习入门,支持向量机
  • Vite + React + Tailwind v4 正确配置指南(避免掉进 v3 的老坑)
  • 为什么程序员总是发现不了自己的Bug?
  • Flutter 3.35.2 主题颜色设置指南
  • 使用 qmake 生成 Makefile,Makefile 转换为 Qt 的 .pro 文件
  • Redis核心数据类型解析——string篇
  • 基于YOLO8的番茄成熟度检测系统(数据集+源码+文章)
  • 2025年女性最实用的IT行业证书推荐:赋能职业发展的8大选择
  • Elasticsearch面试精讲 Day 5:倒排索引原理与实现
  • IoTDB对比传统数据库的五大核心优势
  • 深度估计:单目视觉实现车距测量和车速估计(含完整项目代码)
  • ubantu20.04 git clone 无法连接问题与解决方法
  • netstat用法
  • 别再让分散 IO 拖慢性能!struct iovec:高效处理聚集 IO 的底层利器
  • pikachu之 unsafe upfileupload (不安全的文件上传漏洞)
  • 力扣hot100:除自身以外数组的乘积(除法思路和左右前缀乘积)(238)
  • 毕业项目推荐:70-基于yolov8/yolov5/yolo11的苹果成熟度检测识别系统(Python+卷积神经网络)
  • 【无人机三维路径规划】基于遗传算法GA结合粒子群算法PSO无人机复杂环境避障三维路径规划(含GA和PSO对比)研究
  • 基于单片机醉酒驾驶检测系统/酒精检测/防疲劳驾驶设计
  • 基于单片机雏鸡孵化恒温系统/孵化环境检测系统设计
  • WPF启动窗体的三种方式
  • 【Day 42】Shell-expect和sed
  • 【python】lambda函数
  • Ubuntu 24.04 服务器配置MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程
  • ubuntu部署MySQL服务
  • 数据结构——树(04二叉树,二叉搜索树专项,代码练习)
  • 【硬核干货】把 DolphinScheduler 搬进 K8s:奇虎 360 商业化 900 天踩坑全记录
  • 从零开始:用代码解析区块链的核心工作原理
  • linux开发板(rk3568,树莓派)自动连接保存好的WIFI