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

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
在这里插入图片描述

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#通过OpenCL调用显卡GPU做高效并行运算
  • c++ 原型模式
  • tornado获取请求参数
  • Qt中的父窗口子窗口和父类子类的区别
  • Nginx: 负载均衡基础配置, 加权轮序, hash算法, ip_hash算法, least_conn算法
  • 单一职责原则介绍
  • wordpress 页面URL自动跳转到图片地址?
  • H5手机端调起支付宝app支付
  • [线程]单例模式 及 指令重排序
  • 面向对象编程
  • axios响应
  • c-数据结构(顺序表、链表)
  • 【GD32】RT-Thread实时操作系统移植(GD32F470ZGT6)
  • 【SpringCloud Alibaba】(十一)学习 Sleuth 链路追踪
  • 百度飞浆目标检测PPYOLOE模型在PC端、Jetson上的部署(python)
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS实用技巧干货
  • Docker 笔记(2):Dockerfile
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • ng6--错误信息小结(持续更新)
  • orm2 中文文档 3.1 模型属性
  • PhantomJS 安装
  • PHP的Ev教程三(Periodic watcher)
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Terraform入门 - 1. 安装Terraform
  • Unix命令
  • Vue学习第二天
  • vue自定义指令实现v-tap插件
  • 聊聊flink的TableFactory
  • k8s使用glusterfs实现动态持久化存储
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ![CDATA[ ]] 是什么东东
  • #if #elif #endif
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (ibm)Java 语言的 XPath API
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二)PySpark3:SparkSQL编程
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (简单) HDU 2612 Find a way,BFS。
  • (九)c52学习之旅-定时器
  • (五)IO流之ByteArrayInput/OutputStream
  • (译)计算距离、方位和更多经纬度之间的点
  • ..回顾17,展望18
  • .Net Core 微服务之Consul(二)-集群搭建
  • .NET Core 项目指定SDK版本
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET 服务 ServiceController
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net各种迷惑命名解释