shell了解和问答机制

2024-09-02 05:12
文章标签 shell 问答 了解 机制

本文主要是介绍shell了解和问答机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GUI(图形用户界面)

定义与特点:

GUI全称为Graphical User Interface,即图形用户界面。
它是一种采用图形方式显示的计算机操作用户界面,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其它一些日常任务。
GUI由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成。
功能与优势:

GUI实现了人与计算机等电子设备的人机交互,是用户与操作系统之间进行数据传递和互动操控的工具。
相比传统的字符界面,GUI具有直观、易用、美观等优点,能够显著提高用户的使用效率和满意度。
它综合了人机工程学、认知心理学、设计艺术学、语言学、社会学、传播学等众多学科领域的知识,已经成为现代电子产品不可或缺的一部分。

cmdline(命令行界面)

定义与特点:

cmdline即命令行界面,是一种基于文本的界面,用户通过输入命令来与计算机进行交互。
在命令行界面中,用户不能直接使用鼠标进行操作,而是需要通过键盘输入命令来完成各种任务。
命令行界面具有高度的灵活性和可定制性,用户可以通过编写脚本来自动化完成复杂的任务。
应用场景:

命令行界面在Linux等操作系统中得到了广泛应用,尤其是在服务器管理、程序开发等领域。
对于专业人士来说,熟练掌握命令行界面是提高工作效率的重要手段之一。

什么是shell

Shell 是一种命令行界面(CLI),它允许用户与操作系统(如 Linux 或 Unix)进行交互。Shell 充当了用户与操作系统内核之间的桥梁,接收用户输入的命令,并将其转换为内核能理解的形式执行。执行完毕后,Shell 会将结果返回给用户。简单来说,Shell 是用户与操作系统之间的接口。

Shell 的功能非常强大,它不仅可以执行系统命令,还可以编写复杂的脚本,以自动化执行一系列的任务。这些脚本可以包含条件判断、循环、函数调用等高级编程特性,使得 Shell 编程在系统管理、自动化部署、批处理任务等方面具有广泛的应用。

Shell 有多种类型,每种类型都有其独特的特点和用法。在 Unix 和类 Unix 系统(如 Linux)中,最常见的 Shell 包括以下几种:

Bourne Shell (sh): 这是最初的 Unix Shell,由 Stephen Bourne 在 1970 年代编写。它奠定了后续 Shell 的基础。
Bourne Again SHell (bash): bash 是 Bourne Shell 的一个增强版,由 Brian Fox 和 Chet Ramey 开发。它增加了很多新的特性,比如命令和文件名的补全、作业控制、命令行编辑等。bash 是目前大多数 Linux 发行版的默认 Shell。
C Shell (csh) 和 TENEX C Shell (tcsh): 这些 Shell 类似于 C 语言的语法,提供了更强大的编程能力。它们特别适合那些熟悉 C 语言的用户。
Korn Shell (ksh): 由 David Korn 开发,旨在成为 sh 和 csh 的超集,同时提供了一些新的特性,如命令别名、数组变量等。
Z Shell (zsh): zsh 是一个功能强大的 Shell,它提供了比 bash 更多的特性,比如改进的自动补全、更灵活的命令别名等。

shell实战1-从零写最简单shell

使用printf和scanf做输入回显

#include <stdio.h>
#include <string.h>#define MAX_LINE_LENGTH 256
int main(void)
{char str[MAX_LINE_LENGTH];//存放用户输入的命令内容while (1){//打印命令行提示符,注意不能加换行printf("aston#");//清除str数组的内容memset(str,0,sizeof(str));//shell第一步 获取用户输入的命令scanf("%s",str);//shell第二步 解析用户命令//shell第三步 出来用户命令printf("%s\n",str);}return 0;
}

在这里插入图片描述

定义简单命令集

#include <stdio.h>
#include <string.h>#define MAX_LINE_LENGTH 256 //命令长度限制
#define MAX_CMD_NUM     100 //最多支持的命令数目//定义一些标准命令
#define led "led"
#define lcd "lcd"
#define pwm "pwm"
#define MAX_CMD_NUM_TMP     3 //当前最多支持的命令数目static void  init_cmd_set(void);char g_cmdset[MAX_CMD_NUM_TMP][MAX_LINE_LENGTH];int main(void)
{int i = 0;char str[MAX_LINE_LENGTH];//存放用户输入的命令内容init_cmd_set();while (1){//打印命令行提示符,注意不能加换行printf("aston#");//清除str数组的内容memset(str,0,sizeof(str));//shell第一步 获取用户输入的命令scanf("%s",str);//shell第二步 解析用户命令//shell第三步 出来用户命令for (i = 0; i<MAX_CMD_NUM_TMP; i++){if(!strcmp(str,g_cmdset[i])){//相等 找到了命令printf("输入的 %s 是合法的\n",str);break;}}if(i>=MAX_CMD_NUM_TMP){//找遍了 都没有找到printf("%s 不是合法命令\n",str);}}return 0;
}//初始化命令列表
static void  init_cmd_set(void)
{memset(g_cmdset,0,sizeof(g_cmdset));strcpy(g_cmdset[0],led);strcpy(g_cmdset[1],lcd);strcpy(g_cmdset[2],pwm);
}

在这里插入图片描述

shell脚本的运行机制:解释运行

(1)C语言(C++)这种编写过程是:编写出源代码(源代码是不能直接运行的)然后编译链接形成可执行二进制程序,然后才能运行;而脚本程序不同,脚本程序编写好后源代码即可直接运行(没有编译链接过程)
(2)shell程序是解释运行的,所谓解释运行就是说当我们执行一个shell程序时,shell解析器会逐行的解释shell程序代码,然后一行一行的去运行。(顺序结构)
(3)CPU实际只认识二进制代码,根本不认识源代码。脚本程序源代码其实也不是二进制代码,CPU也不认识,也不能直接执行。只不过脚本程序的编译链接过程不是以脚本程序源代码为单位进行的,而是在脚本运行过程中逐行的解释执行时才去完成脚本程序源代码转成二进制的过程(不一定是编译链接,因为这行脚本程序可能早就编译连接好了,这里我们只是调用它)的。

编辑器、编译器、运行方法(脚本的3种执行方法)

(1)shell程序是文本格式的,只要是文本编辑器都可以。但是因为我们的shell是要在linux系统下运行的,所以换行符必须是’\n’,而windows下的换行符是"\r\n",因此windows中的编辑器写的shell不能在linux下运行。所以我们整个课程都是在linux下使用vi编辑器(实际上是vim)进行编写调试的。
(2)编译器 不涉及,因为shell是解释性语言,直接编辑完就可以运行。
(3)shell程序运行的运行有多种方法,这里介绍三种方法:
第一种:./xx.sh,和运行二进制可执行程序方法一样。这样运行shell要求shell程序必须具有可执行权限。chmod a+x xx.sh来添加可执行权限。
第二种:source xx.sh,source是linux的一个命令,这个命令就是用来执行脚本程序的。这样运行不需要脚本具有可执行权限。
第三种:bash xx.sh,bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了bash程序,然后把xx.sh作为argv[1]传给他运行。

#!/bin/sh
# 注释string="hello" # 定义 初始化
echo $string # 使用echo "${string}world" # 使用

shell中无引用、单引号和双引号的区别

(1)shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以,但是缺陷是不能输出"或者其他转义字符。
(2)shell中也可以使用单引号来表示字符串,也是直接使用的,不能输出转义字符。
(3)单引号中:完全字面替换(不可包含单引号本身)
(4)双引号中:
$加变量名可以取变量的值
反引号仍表示命令替换
表示 表示 表示的字面值 输出$符号
表示的字面值
"表示"的字面值
\表示\的字面值
除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。

shell中调用linux命令

(1)直接执行
(2)反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。

结构

# 读取用户输入  
echo "请输入一个数字(1, 2, 或 3):"  
read num  # 使用 if-elif-else 结构根据输入执行不同的操作  
if [ "$num" -eq 1 ]; then  echo "你输入了 1"  
elif [ "$num" -eq 2 ]; then  echo "你输入了 2"  
else  if [ "$num" -eq 3 ]; then  echo "你输入了 3,但是这部分本来可以通过 elif 来简化。"  else  echo "你输入的不是 1、2 或 3。"  fi  
fi  
-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)
判断文件是否存在。(-f),注意[]里面前后都有空格,不能省略。
判断目录是否存在  (-d)
判断字符串是否相等("str1" = "str2"),注意用一个等号而不是两个

打印出从1到5的数字

for i in {1..5}  
do  echo "Number $i"  
done

在这里插入图片描述

while循环在给定条件为真时重复执行一系列命令
譬如:while后面的[]两边都有空格,[]后面有分号分号(如果do放在一行的话),i++的写法中有两层括号。

counter=4 
while [ $counter -le 5 ]  
do  echo "Counter is $counter"  let counter++  
done

在这里插入图片描述

判断文件是否存在

# 定义文件路径  
file_path="/path/to/your/file.txt"  # 使用if语句和-f选项判断文件是否存在  
if [ -f "$file_path" ]; then  echo "文件存在"  
else  echo "文件不存在"  
fi

echo的创建和追加输入文件

(1)在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>。
(2)还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。
会创建(或覆盖)file.txt 文件,并写入文本“这是第一行文本。”。

echo "这是第一行文本。" > file.txt

将文本追加到文件的末尾,而不是覆盖文件内容,可以使用 >> 重定向操作符。

echo "这是追加的一行文本。" >> file.txt

在这里插入图片描述

逻辑与(AND)

if [ -f file1.txt ] && [ -f file2.txt ]; then  echo "两个文件都存在"  
else  echo "至少有一个文件不存在"  
fi
[ -f file1.txt ] && [ -f file2.txt ] && echo "两个文件都存在" || echo "至少有一个文件不存在"

逻辑或(OR)

if [ ! -f file1.txt ] || [ ! -f file2.txt ]; then  echo "至少有一个文件不存在"  
else  echo "两个文件都存在"  
fi
[ ! -f file1.txt ] || [ ! -f file2.txt ] && echo "至少有一个文件不存在"

字符串是否相等

# 定义两个字符串变量  
str1="Hello, World!"  
str2="Hello, World!"  
str3="Goodbye, World!"  # 使用if语句和单个等号(=)来比较字符串  
if [ "$str1" = "$str2" ]; then  echo "str1 和 str2 相等"  
else  echo "str1 和 str2 不相等"  
fi  # 另一个比较示例  
if [ "$str1" = "$str3" ]; then  echo "str1 和 str3 相等"  
else  echo "str1 和 str3 不相等"  
fiif [ -z "$str3" ]; then  echo "str3 为空"  
else  echo "str3 不为空"  
fi

case

#!/bin/sh  # 读取用户输入  
echo -n "请输入一个数字(1-3): "  
read num  # 使用case语句根据输入的数字执行不同的操作  
case $num in  1)  echo "你输入了 1"  ;;  2)  echo "你输入了 2"  ;;  3)  echo "你输入了 3"  ;;  *)  echo "无效输入,请输入1、2或3"  ;;  
esac  echo "脚本执行完毕"

case 和while

#!/bin/bash  echo -n "请输入一个数字(1-3): "  
read num 
count=1  # 使用while循环,当count小于或等于num时执行循环体  
while [ $count -le $num ]; do  # 使用case语句根据count的值执行不同的操作  case $count in  1)  echo "这是第 $count 次循环"  ;;  2)  echo "已经循环到第 $count 次了"  ;;  3)  echo "这是最后一次循环,count=$count"  ;;  *)  # 这个分支通常不会执行,因为count的值被严格控制在13之间  echo "不可能执行到这里,除非count的值不是1, 2, 或 3"  ;;  esac  # 计数器加1  ((count++))  
done  echo "循环结束"

传参

#!/bin/sh  # 显示脚本名称  
echo "脚本名称: $0"  # 显示传递给脚本的参数个数  
echo "参数个数: $#"  # 显示所有传递给脚本的参数  
echo "所有参数: $*"  
echo "所有参数(独立): $@"  # 显示第一个参数  
echo "第一个参数: $1"  # 显示第二个参数(如果存在)  
if [ "$#" -ge 2 ]; then  echo "第二个参数: $2"  
else  echo "没有第二个参数"  
fi  # 你可以继续以这种方式访问更多的参数

执行source hello.sh Hello World
在这里插入图片描述

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

这篇关于shell了解和问答机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1129087

相关文章

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

SpringShell命令行之交互式Shell应用开发方式

《SpringShell命令行之交互式Shell应用开发方式》本文将深入探讨SpringShell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例