shell了解和问答机制

news2024/11/13 21:49:39

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 不相等"  
fi

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海康二次开发学习笔记12-从Group外部输入图像

从Group外部输入图像 用OpenCV从本地读图 当Group内部无图像源模块时,可以通过代码的方式将图片传入Group内部.实现方式有多种,可以使用OpenCV从本地读图,可在程序集搜索引用OpenCvSharp&#xff0c;同时将其复制本地的属性改为False. 1. 界面设计 增加加载图像按钮 2. 处理…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(二)- 3GPP Release16 内容

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…

学习Kerberos

学习Kerberos Kerberos的 是一种分布式、基于票证的身份验证服务&#xff0c;因为基于分布式&#xff0c;可能这种类型的协议我们平时接触比较少&#xff0c;Web端一般都是通过Cookie、Token、Oauth、Password等各种协议认证&#xff0c;客户端通过Ssh、Password等认证方式&am…

WAF的功能、检测、指纹及绕过

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

尝试用java spring boot+VUE3实现前后端分离部署

前言 这几天开学了&#xff0c;公司这边几个和学校对接的项目都挺忙的&#xff0c;然后我又开始有点闲的情况了。问大佬能不能继续看看若依的项目&#xff0c;大佬让我自己去学了。在看若依的项目的时候在想&#xff0c;python的FLASK后端实现和JAVA spring boot的实现差别大不…

Redis与SpringMVC的整合与最佳实践

整合Redis与Spring MVC&#xff08;现在通常是Spring Boot的一部分&#xff09;可以提高应用性能&#xff0c;特别是在处理大量数据缓存和会话状态管理方面。 下面是一些关于如何整合Redis与Spring MVC的最佳实践&#xff1a; 1. 引入依赖 首先&#xff0c;你需要在你的项目中…

Linux之grafana+onealert报警

grafana介绍 Grafana是一个开源的度量分析和可视化工具&#xff0c;可以通过将采集的数据分析&#xff0c;查询&#xff0c;然后进行可视化的展示,并能实现报警。 grafana安装与登录 在grafana服务器上安装grafana 下载地址&#xff1a;https://grafana.com/grafana/downloa…

包装类及常量池

1、基本数据类型byte、short、int、long、char、boolean的包装类用到了常量池&#xff0c;大小在127以内的从常量池获取&#xff1b; 2、基本数据类型中float、double没有实现常量池技术&#xff1b; 3、java中字符串实现常量池技术&#xff1b; public class Test {public …

电机设计及电机仿真“新工具”—仿真APP

电机仿真APP可以广泛应用于电机设计、制造、测试和维护领域&#xff0c;具有强大的计算能力&#xff0c;能够模拟电机的各种工作状态和参数变化。用户可通过调整仿真参数&#xff0c;快速得到电机的响应和性能参数&#xff0c;从而进行针对性的优化和改进。借助仿真APP&#xf…

动态规划法例题

第一个空&#xff0c;用手工计算&#xff0c;可以用贪心法 先选择价值最大的物品&#xff0c;有两个价值是6的物品&#xff0c;重量合计246 剩余4个空间&#xff0c;只能放重量为2的物品&#xff0c;一共是66315 第二个空&#xff0c;需要将所有物品都放进背包舱室&#xff…

黄力医生:血压高降不下来找准这三个方向真的降下来了

在心脑血管疾病的诊疗中&#xff0c;高血压作为一种常见的慢性病&#xff0c;其管理和控制对于预防心脑血管疾病的发生和发展至关重要。然而&#xff0c;许多患者面临血压居高不下、难以控制的困境。今天&#xff0c;我们有幸邀请到心脑血管科专家黄力医生&#xff0c;为大家深…

React中实现antd自定义图标,鼠标悬浮变色

借助 antd 的 tooltip 组件来实现 hover 时变色的效果 1.新建组件 自定义图标一般在iconfont上面获取&#xff0c;复制下来的svg代码&#xff0c;切记要删除 fill 属性后添加到组件中 import { Tooltip } from "antd"; import React from "react";const …

【JavaWeb】Cookie、Session

文章目录 Cookie、Session一、Cookie&#xff08;客户端&#xff09;1、Cookie 的 特点2、Cookie 的 工作原理3、Cookie 的 基本操作5、Cookie 的 域名与路径6、Cookie 的 存活时间7、Cookie 的 删除 二、Session&#xff08;服务端&#xff09;1、Session 的 特点2、Session 的…

Mysql性能优化之自适应索引

自适应索引 是什么 自适应哈希索引是 InnoDB 存储引擎为了提高特定类型查询性能而自动构建的一种内存中的哈希索引结构。它可以根据查询模式和数据访问频率自动调整&#xff0c;以优化数据库的性能。 与BTree的区别 与传统的 B-tree 索引不同&#xff0c;哈希索引使用哈希函…

基于Java的旅游服务管理系统的设计与实现(论文+源码)_kaic

摘 要 伴随着人们生活水平的提高&#xff0c;服务行业也得到了飞速发展。人们对旅游活动也越来越重视。很多旅游爱好者以及生活压力过大的人都会选择周末&#xff0c;节假日或自己休闲时外出旅游&#xff0c;换种环境来放松心情&#xff0c;缓解工作压力&#xff0c;尽享别样生…

GHA文章是AI文章吗?

对于想做外贸的客户来说&#xff0c;谷歌SEO成为了每个网站的必攻课题&#xff0c;而在SEO策略中&#xff0c;内容质量至关重要&#xff0c;而现在&#xff0c;ai产业的发达也让不少人看见出海的希望&#xff0c;因为内容可以让ai生成&#xff0c;那么&#xff0c;现在火爆seo圈…

Leetcode199二叉树的右视图(java实现)

今天我们分享的题目是199题&#xff0c;题目描述如下&#xff1a; 那么本道题的解题思路呢就是使用层序遍历&#xff0c;每次将每层中的最后一个元素加入到我们的集合中。 本道题目和之前的层序遍历二叉树的题目很像&#xff0c;但是需要注意的细节。那么我会在代码中指出。 代…

JSON处理库 -- Fastjson

文章目录 一、json格式1.1 用途1.2 语法1.3 常见格式 二、fastjson常用类2.1 JSONObject2.2 JSONArray 三、序列化和反序列化3.1 默认序列化与反序列化3.2 序列化的扩展3.3 自定义序列化SerializeFilter3.4 JSONField 注解3.5 复习Jackson 一、json格式 1.1 用途 一种轻量级的…

SpringBoot3集成Spring Authorization Server和Spring Cloud Gateway实现网关统一认证

1. 概述 在微服务开发过程中&#xff0c;通常都会使用Spring Cloud Gateway构建统一的API网关&#xff0c;在访问微服务之前都会先校验访问者是否有权限访问资源&#xff0c;实现方式有很多&#xff0c;这里主要介绍Spring Cloud Gateway集成OAuth2.1如何实现网关统一认证。 S…

公众号里的产品宣传册是如何制作的?

​随着微信的普及&#xff0c;越来越多的企业和个人开始关注公众号&#xff0c;希望通过这个平台宣传自己的产品和服务。然而&#xff0c;你是否想过&#xff0c;那些公众号里精美的产品宣传册是如何制作出来的呢&#xff1f;今天&#xff0c;就让我来带你了解公众号产品宣传册…