Linux从0——1之shell编程4

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站泷羽sec](https://space.bilibili.com/350329294)

1,使用read命令获取用户输入

read命令是Shell脚本中用于从标准输入(通常是键盘)读取数据的一个内置命令。它能够将用户输入的数据赋值给一个或多个变量,从而实现与用户的交互。此外,read命令还支持多种选项来定制输入行为,例如设置提示信息、限制输入字符数、隐藏输入内容等。

read命令的基本形式如下:

read [选项] [变量1] [变量2] …

选项

描述

-a arrayname

将输入的字段存储到指定的数组中

-d delim

使用指定的字符作为行的结束标志

-e

启用输入补全功能

-i text

在输入编辑缓冲区中预置文本

-n nchars

定义输入文本的长度,而不是读取整行

-N nchars

定义输入文本的长度,不考虑行分隔符

-p prompt

在输入前打印提示信息

-r

屏蔽反斜杠\,将其作为普通字符处理

-s

静默模式,不在屏幕上显示输入的字符

-t timeout

指定等待输入的秒数

read命令的高级用法

除了基本的输入读取外,read命令还支持一些高级用法,例如:

  • 读取多行输入:可以通过循环来读取多行输入。
  • 读取文件内容:结合cat命令和管道,可以读取文件内容。
  • 定时输入:使用-t选项可以设置一个超时时间,如果在这个时间内没有输入,则自动退出。

实例一,获取用户输入并打印

实例二,read命令结合循环来连续获取用户输入

#!/bin/bash
echo "输入 'exit' 来结束程序"
while true; do
    read input
    if [ "$input" == "exit" ]; then
        break
    else
        echo "你输入的是: $input"
    fi
done
echo "程序已结束"

2. 使用select命令创建菜单

select 是 shell 编程中的一个命令,用于创建一个简单的菜单系统。它允许用户从一组选项中选择一个项目,并返回所选项目的索引或值。select 命令通常与 case 语句结合使用,以根据用户的选择执行不同的操作。

select 命令的基本语法如下:

select 变量 in 选项列表
do
    命令块
done

  • 变量:用于存储用户选择的值。
  • 选项列表:一个由空格分隔的字符串列表,表示菜单中的选项。
  • 命令块:用户选择后执行的命令块。

实例一,使用 select 命令创建简单菜单

#!/bin/bash
echo "请选择一个选项:"
select choice in "1" "2" "3"
do
  case $choice in
    "1")
      echo "你选择了选项1"
      break
      ;;
    "2")
      echo "你选择了选项2"
      break
      ;;
    "3")
      echo "你选择了选项3"
      break
      ;;
    *)
      echo "无效的选择"
      ;;
  esac
done

  1. PS3 是一个特殊的 shell 变量,用于定义 select 命令的提示符。
  2. select choice in "选项1" "选项2" "选项3" "退出":创建一个包含四个选项的菜单。
  3. case $choice in:根据用户的选择执行相应的命令块。
  4. break:当用户选择“退出”时,退出 select 循环。

3. 使用dialog工具创建图形化对话框

dialog 是一个可以在Linux终端中创建图形化对话框的工具。它可以与shell脚本结合使用,以创建更友好的用户界面。以下是如何使用 dialog 工具创建各种类型的对话框。

安装dialog

apt-get install dialog

创建对话框

1. 消息框 (Msgbox)

消息框用于显示一条消息,并要求用户点击“OK”按钮确认。

dialog --title "消息框" --msgbox "这是一个消息框示例" 10 30

2. 输入框 (Inputbox)

输入框允许用户输入文本。

dialog --title "输入框" --inputbox "请输入你的名字:" 10 30 2> /tmp/input.txt 

用户输入的内容会被重定向到 /tmp/input.txt 文件中。

3. 确认框 (Yes/No Box)

确认框用于显示一个带有“YES”和“NO”按钮的对话框。

dialog --title "确认框" --yesno "这是一个确认框示例" 10 30

4. 菜单 (Menu)

菜单允许用户从一组选项中选择一个项目。

dialog --title "菜单" --menu "请选择一个选项" 15 30 10 \
    1 "选项1" \
    2 "选项2" \
    3 "选项3" \
    4 "退出" 2> /tmp/menu.txt 

用户选择的选项会被写入 /tmp/menu.txt 文件中。

5. 复选框 (Checklist)

复选框允许用户选择多个选项。

dialog --title "复选框" --checklist "请选择你喜欢的水果" 15 40 5 \
    1 "苹果" on \
    2 "香蕉" off \
    3 "橙子" on \
    4 "葡萄" off 2> /tmp/checklist.txt 

用户选择的选项会被写入 /tmp/checklist.txt 文件中。

6. 单选框 (Radiolist)

单选框允许用户选择一个选项。

dialog --title "单选框" --radiolist "请选择一个选项" 15 40 5 \
    1 "选项1" on \
    2 "选项2" off \
    3 "选项3" off 2> /tmp/radiolist.txt 

用户选择的选项会被写入 /tmp/radiolist.txt 文件中。

实例一:创建一个消息框

#!/bin/bash
dialog --title "消息框" --msgbox "这是一个消息框。" 10 30
dialog --title "输入框" --inputbox "请输入你的名字:" 10 30 2> name.txt 
name=$(cat name.txt) 
dialog --title "你好" --msgbox "你好,$name!" 10 30

4,条件判断前言:关系运算符

在Shell编程中,关系运算符主要用于比较数值或字符串,以便在条件语句中进行决策。这些运算符在编写条件逻辑时非常有用,例如在if语句或while循环中。

关系运算符概述

以下是常用的关系运算符及其功能说明:

运算符

描述

-eq

检测两个数是否相等

-ne

检测两个数是否不相等

-gt

检测左边的数是否大于右边的

-lt

检测左边的数是否小于右边的

-ge

检测左边的数是否大于等于右边的

-le

检测左边的数是否小于等于右边的

这些运算符通常用于整数比较。对于字符串比较,有其他专门的运算符。

示例代码

以下是一些使用关系运算符的示例代码:

#!/bin/bash
 # 定义两个变量
a=5
b=10
# 使用if语句进行比较
if [ $a -eq $b ]; then
    echo "$a 等于 $b"
else
    echo "$a 不等于 $b"
fi
 
if [ $a -gt $b ]; then
    echo "$a 大于 $b"
else
    echo "$a 不大于 $b"
fi
 
if [ $a -lt $b ]; then
    echo "$a 小于 $b"
else
    echo "$a 不小于 $b"
fi
 
if [ $a -ge $b ]; then
    echo "$a 大于等于 $b"
else
    echo "$a 不大于等于 $b"
fi
 
if [ $a -le $b ]; then
    echo "$a 小于等于 $b"
else
    echo "$a 不小于等于 $b"
fi

注意事项

  1. 运算符仅适用于数字:关系运算符只能用于数字比较。如果尝试比较非数字字符串,可能会导致错误。
  2. 空格:在使用关系运算符时,必须在运算符和操作数之间留有空格。例如,[ $a -eq $b ] 是正确的,而 [ $a-$b ] 则会导致语法错误。
  3. 引号:在某些情况下,特别是当操作数可能是空字符串时,建议使用双引号来保护变量。例如,[ "$a" -eq "$b" ]。

5,条件判断

条件判断的基本语法

在Shell编程中,条件判断通常使用if语句来实现。if语句的基本语法如下:

if [ condition ]; then
    # 如果条件为真,执行这里的代码
else
    # 如果条件为假,执行这里的代码
fi

常用的条件判断

Shell中常用的条件判断包括文件判断、字符串判断和数值判断。

文件判断

  • -e file: 判断文件是否存在。
  • -f file: 判断文件是否存在且为普通文件。
  • -d dir: 判断目录是否存在。
  • -r file: 判断文件是否可读。
  • -w file: 判断文件是否可写。
  • -x file: 判断文件是否可执行。

字符串判断

  • -z string: 判断字符串是否为空。
  • -n string: 判断字符串是否非空。
  • string1 = string2: 判断两个字符串是否相等。
  • string1 != string2: 判断两个字符串是否不相等。

数值判断

  • num1 -eq num2: 判断两个数值是否相等。
  • num1 -ne num2: 判断两个数值是否不相等。
  • num1 -gt num2: 判断num1是否大于num2。
  • num1 -lt num2: 判断num1是否小于num2。
  • num1 -ge num2: 判断num1是否大于或等于num2。
  • num1 -le num2: 判断num1是否小于或等于num2。

多条件判断

在Shell中,可以使用elif来进行多条件判断。语法如下:

if [ condition1 ]; then
    # 如果condition1为真,执行这里的代码
elif [ condition2 ]; then
    # 如果condition1为假且condition2为真,执行这里的代码
else
    # 如果所有条件都为假,执行这里的代码
fi

实例一,条件判断语句使用

#!/bin/bash
FILE="example.txt" 
if [ -e "$FILE" ]; then
    echo "File exists."
else
    echo "File does not exist."
fi
 
STRING1="Hello"
STRING2="World"
if [ "$STRING1" = "$STRING2" ]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi
 
NUM1=10
NUM2=20
if [ "$NUM1" -lt "$NUM2" ]; then
    echo "NUM1 is less than NUM2."
else
    echo "NUM1 is not less than NUM2."
fi

通过这些基本的条件判断,你可以在Shell脚本中实现复杂的逻辑控制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024.5 AAAiGLaM:通过邻域分区和生成子图编码对领域知识图谱对齐的大型语言模型进行微调

GLaM: Fine-Tuning Large Language Models for Domain Knowledge Graph Alignment via Neighborhood Partitioning and Generative Subgraph Encoding 问题 如何将特定领域知识图谱直接整合进大语言模型(LLM)的表示中,以提高其在图数据上自…

【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断

【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断 目录 文章目录 【大语言模型】ACL2024论文-15 大型语言模型中的最佳解释推断目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果推荐阅读指数:★★★★☆后记 大型语言模型中的最佳解释推断 摘…

【最新鸿蒙开发之性能优化——动态加载和延迟加载】

大家好,我是学徒小z,在经历了一段时间项目开发中,我也渐渐意识到了性能的重要性,今天就分享一篇优化应用运行性能的文章,话不多说,开干! 引言 延时触发操作与延迟加载的简介 动态加载&#x…

云计算研究实训室建设方案

一、引言 随着云计算技术的迅速发展和广泛应用,职业院校面临着培养云计算领域专业人才的迫切需求。本方案旨在构建一个先进的云计算研究实训室,为学生提供一个集理论学习、实践操作、技术研发与创新于一体的综合性学习平台,以促进云计算技术…

信号保存和信号处理

目录 信号保存中重要的概念 内核中信号的保存 对sigset_t操作的函数 对block,pendding,handler三张表的操作 sigpromask ​编辑 sigpending 是否有sighandler函数呢? 案例 信号处理 操作系统是如何运行的? 硬件中断 …

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转(跨文件跳转)这些功能

(一)方法一:安装插件SystemVerilog - Language Support 安装一个vscode插件即可,插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&am…

初识算法 · 模拟(1)

目录 前言: 替换所有的问号 题目解析 算法原理 算法编写 提莫攻击 题目解析 算法原理 算法编写 外观数列 题目解析 算法原理 算法编写 前言: ​本文的主题是模拟,通过三道题目讲解,一道是提莫攻击,一道是…

〔 MySQL 〕数据类型

目录 1.数据类型分类 2 数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float 2.3.2 decimal 3 字符串类型 3.1 char 3.2 varchar 3.3 char和varchar比较 4 日期和时间类型 5 enum和set mysql表中建立属性列: 列名称,类型在后 n…

数据结构王道P234第二题

#include<iostream> using namespace std; int visit[MAxsize]; int color[MaxSize];//1表示红&#xff0c;2表示白&#xff1b; bool dfs(Graph G, int i){visit[i]1;ArcNode *p;bool flag1;for(pG.vertices[i].firsrarc; p ; pp->next){int jp->adjvex;if(!visi…

算法——两两交换链表中的节点(leetcode24)

这是一道对于链表节点进行操作的题目非常考验对于链表操作的基本功&#xff1b; 解法: 本题的解法结合下图来进一步解释 创建一个虚拟节点指向头结点以便使代码逻辑看起来更为简便且操作节点容易,定义cur是为了方便找到cur之后的两个节点进行交换操作定义pre和aft是为了保存执…

【AI图像生成网站Golang】项目架构

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 四、项目架构 本项目的后端基于Golang和Gin框架开发&#xff0c;主要包括的模块有&#xff1a; backend/ ├── …

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言&#xff1a;自2021年起&#xff0c;翼鸥教育便开始应用OceanBase社区版&#xff0c;两年间&#xff0c;先后部署了总计12套生产集群&#xff0c;其中核心集群占比超过四分之三&#xff0c;所承载的数据量已突破30TB。自2022年10月&#xff0c;OceanBase 社区发布了4.2.x 版…

ESP32-S3模组上跑通esp32-camera(19)

接前一篇文章&#xff1a;ESP32-S3模组上跑通esp32-camera&#xff08;18&#xff09; 本文内容参考&#xff1a; esp32-camera入门&#xff08;基于ESP-IDF&#xff09;_esp32 camera-CSDN博客 OV5640手册解读-CSDN博客 ESP32_CAM CameraWebServer例程源码解析笔记&#xf…

vmWare虚拟环境centos7安装Hadoop 伪分布式实践

背景&#xff1a;近期在研发大数据中台&#xff0c;需要研究Hadoop hive 的各种特性&#xff0c;需要搭建一个Hadoop的虚拟环境&#xff0c;本来想着使用dock &#xff0c;但突然发现docker 公共仓库的镜像 被XX 了&#xff0c;无奈重新使用vm 搭建虚拟机。 大概经历了6个小时完…

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China&#xff0c;2018年4月established&#xff0c;独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1&#xff08;星辰处理器&#xff09; STAT-MC1&#xff0c;主要为满足AIOT应用性能、功…

c++--------《set 和 map》

c--------《set 和 map》 1 set系列的使⽤1.1 set类的介绍1.2 set的构造和迭代器1.3 set重要接口 2 实现样例2.1: insert和迭代器遍历使⽤样例&#xff1a;2.2: find和erase使⽤样例&#xff1a; 练习3.map系列的使用3.1 map类的介绍3.1.1 pair类型介绍 3.2 map的数据修改3.3mu…

MySQL面试之底层架构与库表设计

华子目录 mysql的底层架构客户端连接服务端连接的本质&#xff0c;连接用完会立马丢弃吗解析器和优化器的作用sql执行前会发生什么客户端的连接池和服务端的连接池数据库的三范式 mysql的底层架构 客户端连接服务端 连接的本质&#xff0c;连接用完会立马丢弃吗 解析器和优化器…

vscode vite+vue3项目启动调试

1、经常我们在普通的项目中&#xff0c;如果算法并不复杂&#xff0c;那么基本上console.log就可以搞定&#xff0c;当然也可以直接alert&#xff0c;打包的时候如果不去掉&#xff0c;还会在发版中上接弹出&#xff0c;给你个惊喜。 2、碰到了有些算法过程比较复杂的情况下&a…

详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)

文章目录 前言1.插入排序&#xff08;InsertSort&#xff09;1.1 核心思路1.2 实现代码 2.选择排序&#xff08;SelectSort&#xff09;2.1 核心思路2.2 实现代码 3.冒泡排序&#xff08;BubbleSort&#xff09;3.1 核心思路3.2 实现代码 4.希尔排序&#xff08;ShellSort&…

IPv6 NDP 记录

NDP&#xff08;Neighbor Discovery Protocol&#xff0c;邻居发现协议&#xff09; 是 IPv6 的一个关键协议&#xff0c;它组合了 IPv4 中的 ARP、ICMP 路由器发现和 ICMP 重定向等协议&#xff0c;并对它们作出了改进。该协议使用 ICMPv6 协议实现&#xff0c;作为 IPv6 的基…