shell 订阅
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。 展开全文
在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
信息
性    质
命令解析器
外文名
shell
用    途
接收用户命令
中文名
shell术语
同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。在排序算法中,Shell是希尔排序的名称。基本上shell分两大类:一:图形界面shell(Graphical User Interface shell 即 GUI shell)例如:应用最为广泛的 Windows Explorer (微软的windows系列操作系统),还有也包括广为人知的 Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的CDE、GNOME、KDE、 XFCE。二:命令行式shell(Command Line Interface shell ,即CLI shell)例如:bash / sh / ksh / csh / zsh(Unix/linux 系统)(MS-DOS系统)cmd.exe/ 命令提示字符(Windows NT 系统)Windows PowerShell(支持 .NET Framework 技术的 Windows NT 系统)传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。Shell基本上是一个命令解释器,类似于DOS下的command。它接收用户命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。交互式shell和非交互式shell交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。shell的类型在UNIX中主要有:Bourne shell (包括 sh,ksh,and bash)Bourne shell ( sh)Korn shell ( ksh)Bourne Again shell ( bash)POSIX shell ( sh)C shell (包括 csh and tcsh)C shell ( csh)TENEX/TOPS C shell ( tcsh)Bourne Shell  首个重要的标准Unix Shell是1979年底在V7 Unix(AT&T第7版)中引入的,并且以它的创始科技部基础条件平台“国家气象网络计算应用节点建设”(2004DKA50730)资助者Stephen Bourne的名字命名。Bourne shell 是一个交换式的命令解释器和命令编程语言。Bourne shell 可以运行为login shell或者login shell的子shell(subshell)。只有login命令可以调用Bourne shell作为一个login shell。此时,shell先读取/etc/profile文件和$HOME/.profile文件。/etc/profile文件为所有的用户定制环境,$HOME/.profile文件为本用户定制环境。最后,shell会等待读取你的输入。C Shell Bill Joy于20世纪80年代早期,在伯克利的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能。Korn Shell 有很长一段时间,只有两类shell供人们选择,Bourne shell用来编程,C shell用来交互。为了改变这种状况,AT&T的bell实验室David Korn开发了Korn shell。ksh结合了所有的C shell的交互式特性,并融入了Bourne shell的语法。因此,Korn shell广受用户的欢迎。它还新增了数学计算,进程协作(coprocess)、行内编辑(inline editing)等功能。Korn Shell 是一个交互式的命令解释器和命令编程语言.它符合POSIX——一个操作系统的国际标准.POSIX不是一个操作系统,而是一个目标在于应用程序的移植性的标准——在源程序一级跨越多种平台。Bourne Again Shell (bash) bash是GNU计划的一部分,用来替代Bourne shell。它用于基于GNU的系统如Linux.大多数的Linux(Red Hat,Slackware,Caldera)都以bash作为缺省的shell,并且运行sh时,其实调用的是bash。POSIX Shell POSIX shell 是Korn shell的一个变种. 当前提供POSIX shell的最大卖主是Hewlett-Packard。在HP-UX 11.0,POSIX shell 就是/bin/sh,而bsh是/usr/old/bin/sh.各主要操作系统下缺省的shell:AIX下是Korn Shell.Solaris缺省的是Bourne shell.FreeBSD缺省的是C shellHP-UX缺省的是POSIX shell.Linux是Bourne Again shell.Windows PowerShell是一种新的交互式的命令行和基于任务脚本编写技术,它使信息技术(IT) 管理员能够全面地自动操作和控制系统管理任务,从而提高了管理员的生产力。Windows PowerShell 包括多个系统管理实用工具、一致的语法和命名惯例、及对普通管理数据更好地导航,如登记、证书存储 或 Windows Management Instrumentation (WMI)。Windows PowerShell 还专门针对 IT 管理,提供直观的脚本编写语言。Shell也是一个VB函数,它的作用是运行程序,语法是Shell(命令字符串[,窗口类型])
收起全文
精华内容
下载资源
问答
  • 更多相关内容
  • shell

    万次阅读 多人点赞 2019-09-16 20:00:00
    shell 什么是shell: 现在我们使用的操作系统(Windows、Mac OS、Android、iOS等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、老年人等)都非常适用;计算机的普及...

    shell

    什么是shell:

    现在我们使用的操作系统(Windows、Mac OS、Android、iOS等)都是带图形界面的,简单直观,容易上手,对专业用户(程序员、网管等)和普通用户(家庭主妇、老年人等)都非常适用;计算机的普及离不开图形界面。
    然而在计算机的早期并没有图形界面,我们只能通过一个一个地命令来控制计算机,这些命令有成百上千之多,且不说记住这些命令非常困难,每天面对没有任何色彩的“黑屏”本身就是一件枯燥的事情;这个时候的计算机还远远谈不上炫酷和普及,只有专业人员才能使用。
    对于图形界面,用户点击某个图标就能启动某个程序;对于命令行,用户输入某个程序的名字(可以看做一个命令)就能启动某个程序。这两者的基本过程都是类似的,都需要查找程序在硬盘上的安装位置,然后将它们加载到内存运行。换句话说,图形界面和命令行要达到的目的是一样的,都是让用户控制计算机。然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。
    由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核。如此一来,用户和内核之间就多了一层“代理”,这层“代理”既简化了用户的操作,也保护了内核。
    用户界面和命令行就是这个另外开发的程序,就是这层“代理”。在Linux下,这个命令行程序叫做 Shell。

    2.shell 作用详析:

    Shell 除了能解释用户输入的命令,将它传递给内核,还可以:
    调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;
    在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;
    Shell 本身也可以被其他程序调用。
    由此可见,Shell 是将内核、程序和用户连接了起来。
    Shell 本身支持的命令并不多,但是它可以调用其他的程序,每个程序就是一个命令,这使得 Shell 命令的数量可以无限扩展,其结果就是 Shell 的功能非常强大,完全能够胜任 Linux 的日常管理工作,如文本或字符串检索、文件的查找或创建、大规模软件的自动部署、更改系统设置、监控服务器性能、发送报警邮件、抓取网页内容、压缩文件等。
    Shell 并不是简单的堆砌命令,我们还可以在 Shell 中编程,这和使用 C/C++、Java、Python 等常见的编程语言并没有什么两样。
    Shell 虽然没有 C/C++、Java、Python 等强大,但也支持了基本的编程元素,例如:
    if…else 选择结构,switch…case 开关语句,for、while、until 循环;
    变量、数组、字符串、注释、加减乘除、逻辑运算等概念;
    函数,包括用户自定义的函数和内置函数(例如 printf、export、eval 等)。
    站在这个角度讲,Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候又是指 Shell 编程。
    Shell 主要用来开发一些实用的、自动化的小工具,而不是用来开发具有复杂业务逻辑的中大型软件,例如检测计算机的硬件参数、一键搭建Web开发环境、日志分析等,Shell 都非常合适。

    3.3.常见的shell类型有 sh、bash、csh、tcsh、ash 等。

    常见的 Shell

    sh
    sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。
    sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。

    csh
    sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。
    Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
    BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。

    tcsh
    tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。

    ash
    一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。

    bash
    bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。
    bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。
    bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。
    尽管如此,bash 和 sh 还是有一些不同之处:
    一方面,bash 扩展了一些命令和参数;
    另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。

    历史命令

    1.history 查询历史命令
    历史命令文件存放在 /root/.bash_history

    [root@localhost ~]# ls  /root/.bash_history  
    /root/.bash_history
    [root@localhost ~]# cat !$
    cat /root/.bash_history
    chmod ~/.ssh 700
    chmod /~.ssh 700
    iptable
    ipaddr
    ip addr
    dhclient
    ip addr
    ping www.baidu.com
    ip route
    vi /etc/sysconfig/network-scripts/ifcfg-ens33 
    ip addr
    ifconfig
    vi /etc/sysconfig/network-scripts/ifcfg-ens33 
    systemctl restart network
    ping www.baidu.com
    mkidr ~/.ssh/
    mkdir ~/.ssh/
    ls
    cd /
    cd 
    ls
    cd ..
    ls
    cd /.ssh
    cd
    ls
    cd ~/.ssh
    vi authorized_keys
    chmod 600authorized_keys
    chmod 600 authorized_keys
    ls
    cd ..
    ls
    cd ..
    cd ~
    ls
    cd ~/.ssh
    ls
    ll
    vi authorized_keys 
    chmod 600 authorized_keys 
    vi authorized_keys 
    chmod 600 authorized_keys 
    cd 
    ls
    cd ..
    ls
    chmod 700 home
    yum install -y lrzsz
    ls
    sz anaconda-ks.cfg 
    ls
    rz
    
    

    3.修改系统摩恩的存储历史命令的条数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    4.设定history命令显示时间

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    5.历史命令的调用

    使用上下箭头调用以前的历史命令
    使用 !n 重复执行第n条历史命令
    使用 !! , !-1 重复执行上一条命令 Ctrl+p+enter亦可
    使用 !ls 重复执行最后一条以ls开头的命令

    命令补全和别名

    tab键补全命令:在输入命令的时候,输入命令的一部分,可以按两下tab键补全命令

    centos6 可以使用tab键补全命令,不支持补全选项;
    centos7 也可以使用tab键补全命令,也支持补全选项,但是需要安装一个bash-completion的包,安装完成后需要重启。

    在这里插入图片描述

    自定义别名

    在这里插入图片描述

    别名的配置文件:~/bash.rc 和 /etc/profile.d/

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    取消别名

    在这里插入图片描述

    通配符、输出重定向

    通配符

    符号作用
    *匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个)
    匹配任何一个字符(不在括号内时)?代表任意1个字符
    [abcd]匹配abcd中任何一个字符
    [a-z]表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符
    {…}表示生成序列. 以逗号分隔,且不能有空格
    [!abcd]或[^abcd]表示非,表示不匹配括号里面的任何一个字符

    在这里插入图片描述

    在这里插入图片描述

    输出重定向

    符号作用
    >正确输出重定向
    >>正确追加输出重定向
    2>错误输出重定向
    2>>错误追加输出重定向
    &>不管正确与否,输出重定向
    &>>不管正确与否,追加输出重定向
    <输入重定向

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    管道符、作业控制

    符号作用
    |把前面命令的结果给后面的命令

    在这里插入图片描述

    作业控制

    命令作用
    ctrl+c发送SIGINT信号,终止一个进程。
    ctrl+z发送SIGSTOP信号,挂起一个进程,将作业放置到后台(暂停状态)。与此同时,可以通过fg重启前台被中断的任务,也可以通过bg把中断的任务放到后台执行。
    jobs查看当前有多少在后台运行的命令
    fg将后台中的命令调至前台继续运行,如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
    bg将一个在后台暂停的命令,变成继续执行,如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
    命令+&这个用在一个命令的最后,可以把这个命令放到后台执行

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • shell脚本编程100例

    2018-07-11 16:57:19
    shell脚本100例,非常经典,从简单的脚本,到最后企业实战可用的复杂脚本,非常适合初学者参考学习!
  • Interop.Shell32.dll

    千次下载 热门讨论 2015-06-16 14:57:57
    Interop.Shell32.dll vs自带的是1.0 会导致一些错误,这个是1.2的
  • letter-shell | 一个功能强大的嵌入式shell

    千次阅读 多人点赞 2020-04-04 19:51:42
    } ⑤ 编辑shell_port.h文件,声明自己编写的初始化函数: #ifndef _SHELL_PORT_H_ #define _SHELL_PORT_H_ #include "shell.h" /* 将shell定义为外部变量,在串口中断回调函数中还要使用 */ extern Shell shell;...

    嵌入式开源项目精选专栏

    本专栏由Mculover666创建,主要内容为寻找嵌入式领域内的优质开源项目,一是帮助开发者使用开源项目实现更多的功能,二是通过这些开源项目,学习大佬的代码及背后的实现思想,提升自己的代码水平,和其它专栏相比,本专栏的优势在于:

    不会单纯的介绍分享项目,还会包含作者亲自实践的过程分享,甚至还会有对它背后的设计思想解读

    目前本专栏包含的开源项目有:

    如果您自己编写或者发现的开源项目不错,欢迎留言或者私信投稿到本专栏,分享获得双倍的快乐!

    1. letter-shell

    本期给大家带来的开源项目是 letter-shell,一个功能强大的嵌入式shell,作者NevermindZZT,目前收获 155 个star,遵循 MIT 开源许可协议。

    letter shell 3.0是一个C语言编写的,可以嵌入在程序中的嵌入式shell,通俗一点说就是一个串口命令行,可以通过命令行调用、运行程序中的函数。


    目前 letter-shell 3.0版本支持的功能有:

    • 命令自动补全
    • 快捷键功能定义
    • 命令权限管理
    • 用户管理
    • 变量支持

    项目地址:https://github.com/NevermindZZT/letter-shell

    2. 移植letter-shell

    2.1. 移植思路

    ① 看项目readme文件中的移植说明,一般都比较完善;
    ② 看项目中的demo,举一反三;
    ③ 看别人移植好的博客;

    2.2. 移植过程

    letter-shell的移植非常简单,自己实现串口读写一个字符的接口,自己编写一个初始化函数,完成。

    本文中我使用的是小熊派IoT开发套件,主控芯片为STM32L431RCT6:

    移植之前需要准备一份裸机工程,我使用STM32CubeMX生成,使用USART1的查询方式发送数据、使用USART1的中断方式接收数据,参考教程:

    ① 复制源码到工程中:

    ② 新建存放实现移植接口的文件:

    ③ 在keil中添加文件,添加头文件路径:

    目录下还有头文件,添加到头文件路径中:

    ④ 编辑shell_port.c文件,实现向串口写入一个字符的接口,并编写shell的初始化函数:

    /**
     * @brief	shell移植到STM32L431时的接口实现
     * @author	mculover666
     * @date	2020/03/27 
    */
    
    #include "shell.h"
    #include <stm32l4xx_hal.h>
    #include "usart.h"
    #include "shell_port.h"
    
    /* 1. 创建shell对象,开辟shell缓冲区 */
    Shell shell;
    char shell_buffer[512];
    
    
    /* 2. 自己实现shell写函数 */
    
    //shell写函数原型:typedef void (*shellWrite)(const char);
    void User_Shell_Write(const char ch)
    {
    	//调用STM32 HAL库 API 使用查询方式发送
    	HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    }
    
    /* 3. 编写初始化函数 */
    void User_Shell_Init(void)
    {
    	//注册自己实现的写函数
        shell.write = User_Shell_Write;
    	
    	//调用shell初始化函数
        shellInit(&shell, shell_buffer, 512);
    }
    

    ⑤ 编辑shell_port.h文件,声明自己编写的初始化函数:

    #ifndef _SHELL_PORT_H_
    #define	_SHELL_PORT_H_
    
    #include "shell.h"
    
    /* 将shell定义为外部变量,在串口中断回调函数中还要使用 */
    extern Shell shell;
    
    /* 声明自己编写的初始化函数 */
    void User_Shell_Init(void);
    
    #endif /* _SHELL_PORT_H_ */
    

    ⑥ 在main.c文件的末尾编写串口中断回调函数,在接收到一个字符之后调用 shellHandler 函数进行处理,首先把头文件包含进来:

    /* USER CODE BEGIN Includes */
    #include "shell_port.h"
    /* USER CODE END Includes */
    

    接着开辟一个串口接收缓冲区(一个字符):

    /* USER CODE BEGIN PV */
    uint8_t recv_buf = 0;
    /* USER CODE END PV */
    

    然后编写回调函数

    /* USER CODE BEGIN 4 */
    /* 中断回调函数 */
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
        /* 判断是哪个串口触发的中断 */
        if(huart ->Instance == USART1)
        {
            //调用shell处理数据的接口
    			  shellHandler(&shell, recv_buf);
            //使能串口中断接收
    			  HAL_UART_Receive_IT(&huart1, (uint8_t*)&recv_buf, 1);
        }
    }
    /* USER CODE END 4 */
    

    ⑥ 在main函数中使能中断接收,调用自己编写的shell初始化函数:

    /* USER CODE BEGIN 2 */
    //使能串口中断接收
    HAL_UART_Receive_IT(&huart1, (uint8_t*)&recv_buf, 1);
    User_Shell_Init();
    /* USER CODE END 2 */
    

    至此,移植完成,编译、下载之后使用串口终端软件Mobaxterm即可看到效果:

    2.3. 宏定义配置

    letter-shell具备很多功能,可以通过宏定义来开启或者关闭,在shell_cfg.h文件中根据需要进行配置:

    在本次移植过程中,我将shell默认用户改为了mculover666,其它宏保持默认:

    #define     SHELL_DEFAULT_USER          "mculover666"
    

    3. 使用letter-shell

    3.1. 应用场景

    在嵌入式项目中,做出一个项目之后还需要用户在串口终端中进行操作,这样的情况很少,串口的作用基本都是用来在调试阶段打印信息。

    但是在调试的模组比较复杂时,比如SPI Flash、LCD屏幕这些,我希望可以在串口直接调用某几个功能函数开始执行,当移植了shell之后,在代码中只需要添加一行宏定义,就可以在串口中调用此函数开始执行,多爽!

    当然也可以在main函数中调用,然后打断点进入调试,根据个人喜好选择就行。

    3.2. 可执行命令定义宏

    这个宏可以实现将函数添加到shell的可执行命令列表中,使用时需要确保shell_cfg.h中的宏定义要开启:

    #define     SHELL_USING_CMD_EXPORT      1
    

    该宏定义的定义如下:

    /**
     * @brief shell 命令定义
     *
     * @param _attr 命令属性
     * @param _name 命令名
     * @param _func 命令函数
     * @param _desc 命令描述
     */
    #define SHELL_EXPORT_CMD(_attr, _name, _func, _desc) \
            const char shellCmd##_name[] = #_name; \
            const char shellDesc##_name[] = #_desc; \
            const ShellCommand \
            shellCommand##_name SECTION("shellCommand") =  \
            { \
                .attr.value = _attr, \
                .data.cmd.name = shellCmd##_name, \
                .data.cmd.function = (int (*)())_func, \
                .data.cmd.desc = shellDesc##_name \
            }
    

    第一个参数attr表示该命令的属性,包括命令权限和命令类型等,但是对于目前这种应用场合下多用户没什么用,所以设置为下面的值就ok:

    SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)
    

    最后需要注意一点,这个宏目前测试在MDK中可以正常使用,在IAR和GCC中请移步项目地址阅读文档。

    3.3. 调用函数示例

    在main.c文件中随便定义一个函数,然后使用宏定义导出到命令列表进行测试:

    /* USER CODE BEGIN 0 */
    int test(int i, char ch, char *str)
    {
        printf("input int: %d, char: %c, string: %s\r\n", i, ch, str);
    	
    	return 0;
    }
    
    //导出到命令列表里
    SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test, test, test);
    
    /* USER CODE END 0 */
    


    有两点需要注意:

    目前支持的参数类型为整型、字符型、字符串型,不支持浮点型参数

    函数最大传入参数个数由shell_cfg.h中的宏定义配置

    
    #define     SHELL_PARAMETER_MAX_NUMBER  8
    

    所以在使用时导出到命令列表中的参数最大是 8 - 1 = 7个,测试如下:

    int test2(int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8)
    {
    	printf("input int: %d, %d, %d, %d, %d, %d, %d, %d\r\n", i1, i2, i3, i4, i5, i6, i7, i8);
    	return 0;
    }
    //导出到命令列表里
    SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), test2, test2, test2);
    

    执行之后失败:

    4. letter-shell设计思想解读

    4.1. 终端软件交互原理

    当我们使用诸如 mobaxterm 这类软件作为串口终端交互时,首先需要注意三点:

    ① 当在终端软件中输入一个字符时,这个字符会被直接通过串口发送,屏幕上不会显示任何东西;
    ② 如果单片机做了回显,终端软件中收到后才会显示出来;
    ③ 当在终端软件中按下回车键、退格键、删除键、四个方向键时,会直接发送其键值,单片机中靠这个键值来解析是否按下了按键。

    在lettershell中输入keys命令即可查看当前支持的按键键值解析:

    解析这些键值的源码在shell.c中,分别对应以下的函数:

    void shellUp(Shell *shell);
    ……
    void shellTab(Shell *shell);
    void shellBackspace(Shell *shell);
    void shellEnter(Shell *shell);
    ……
    

    除此之外,lettershell还支持设置快捷键来快速调用函数执行,比如这里我设置在终端中按下Ctrl+A之后调用hello函数,过程如下:

    ① 首先在串口中断中添加一行代码,查看按下Ctrl+A快捷键之后串口发送的键值:

    编译下载,在终端软件中按下Ctrl+A,得到的键值如下:

    此处需要注意,终端发送的字符串序列以大端模式表示,所以单片机解析的键值应该为0x01000000

    ② 一行代码搞定键值解析,在main文件中添加测试函数hello,并使用宏定义向lettershell中添加按键解析值:

    int hello()
    {
    	printf("Hello World\r\n");
    	return 0;
    }
    SHELL_EXPORT_KEY(SHELL_CMD_PERMISSION(0), 0x01000000, hello, hello);
    

    将之前串口接收中断函数中添加的printt注释,编译,下载:

    4.2. 如何解析命令

    在letter shell中,当它接收到一个字符后,首先判断是不是特殊的按键,否则直接扔进命令解析缓冲区,因为它对左右方向键、退格键处理的比较好,相当于不停的在维护命令解析缓冲区的内容,非常整齐,解析时就变得相对容易了。

    当用户按下回车键时,首先去命令列表中匹配:

    /**
     * @brief shell匹配命令
     * 
     * @param shell shell对象
     * @param cmd 命令
     * @param base 匹配命令表基址
     * @param compareLength 匹配字符串长度
     * @return ShellCommand* 匹配到的命令
     */
    ShellCommand* shellSeekCommand(Shell *shell,
                                   const char *cmd,
                                   ShellCommand *base,
                                   unsigned short compareLength)
    

    如果匹配到之后则开始执行这条命令:

    /**
     * @brief shell运行命令
     * 
     * @param shell shell对象
     * @param command 命令
     */
    static void shellRunCommand(Shell *shell, ShellCommand *command)
    

    限于文章篇幅,具体解析的过程和方法不再深入讲述,如有兴趣可以自行研究学习,另外,=除了本文所讲述的自定义函数调用,自定义快捷键设置,letter shell还有非常多的功能,比如自定义变量查看,用户登录,用户权限,自动锁定shell等高级内容,也欢迎有兴趣的读者探索,研究!

    5. 项目工程源码获取和问题交流

    目前我将LetterShell源码、我移植到小熊派STM32L431RCT6开发板的工程、移植到STM32Nucleo-STM32G071RB开发板的工程源码上传到了QQ群里(包含好几份HAL库,QQ相对速度快点),可以在QQ群里下载,有问题也可以在群里交流,当然也欢迎大家分享出来自己移植的工程到QQ群里

    放上QQ群二维码:

    接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。

    展开全文
  • shell 脚本入门

    千次阅读 2021-07-15 15:42:47
    一、什么是shell 脚本: 如果此时需要在终端中输入一系列命令完成一些操作,但是我们一条一条输入命令,这样就会很麻烦。那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件即可?有!就是 ...

    一、什么是shell 脚本:

    如果此时需要在终端中输入一系列命令完成一些操作,但是我们一条一条输入命令,这样就会很麻烦。那么有没有一种方式可以将很多条命令放到一个文件里面,然后直接运行这个文件即可?有!就是 shell 脚本!

    shell 脚本类似 windows 的批处理文件,shell 脚本就是将连续执行的命令写成一个文件。

    shell 脚本提供数组、循环、条件判断等功能。shell 脚本一般是 Linux 运维或者系统管理员需要掌握的。

    二、shell 脚本写法:

    shell 脚本是个纯文本文件,命令从上而下,一行一行地开始执行。shell 脚本拓展名为.sh。shell 脚本第一行一定要为:

    #!/bin/bash
    

    表示使用bash

    三、shell 脚本语法:

    1、第一个 shell 脚本:

    我们在终端输入:
    在这里插入图片描述
    使用 shell 脚本:

    #!/bin/bash
    echo hello world!
    

    在这里插入图片描述

    2、交互式 shell 脚本:

    脚本:

    #!/bin/bash
    echo "please input name and your age:"
    read name age										#读取键盘输入字符串,赋值给变量 name 和 age
    echo "your name:" $name ",your age: $age"			# shell 脚本输出变量:$变量名
    

    执行结果:
    在这里插入图片描述


    脚本:

    #!/bin/bash
    read -p "please input your name and your age" name age		#-p 后面跟提示信息,即在输入前打印提示信息
    echo "your name: $name,your age $age"
    

    执行结果:
    在这里插入图片描述

    3、shell 脚本的数值计算:

    shell 仅支持整型,数值计算使用$((表达式)),示例:

    #!/bin/bash
    read -p "please input operand and number: " operand number
    echo "$operand + $number = $(($operand+$number))"
    echo "$operand - $number = $(($operand - $number))"
    echo "$operand * $number = $(($operand * $number))"
    divided=$(($operand/$number))						#赋值等号间不能有空格
    echo "$operand / $number = $divided"
    

    执行结果:
    在这里插入图片描述

    4、test 命令:

    test命令用于查看文件是否存在、权限等信息,可以进行数值、字符和文件三方面的测试。

    cmd1 && cmd2
    #当 cmd1 执行完毕且正确,那么 cmd2 执行,当 cmd1 执行完毕且错误,那么 cmd2 不执行
    
    cmd1 || cmd2
    #当 cmd1 执行完毕且正确,那么 cmd2 不执行,当 cmd1 执行完毕且错误,那么 cmd2 执行
    

    字符串测试:

    #!/bin/bash
    read -p "please input first string: " firstStr
    read -p "please input second string: " secondStr
    test $firstStr = $secondStr && echo "The two strings are the same" || echo "The two strings are not the same"
    # test str1 = str2 :两个字符串相等则为真
    

    执行结果:
    在这里插入图片描述


    文件测试:

    #!/bin/bash
    read -p "please input file name: " filename
    test -e $filename && echo "$filename exist" || echo "$filename non-existence"
    # test -e :如果文件存在则为真
    

    执行结果:
    在这里插入图片描述

    5、中括号判断符:

    字符串判断:

    #!/bin/bash
    read -p "please input first string: " firstStr
    read -p "please input second string: " secondStr
    [ "$firstStr" == "$secondStr" ] && echo "The two strings are the same" || echo "The two strings are not the same"
    # 中括号两端内测要加空格,内容建议加 "",否则有空格时会出现参数过多
    [ "$firstStr" != "$secondStr" ] && echo "The two strings are not the same" || echo "The two strings are the same"
    [ "$firstStr" = "$secondStr" ] && echo "The two strings are the same" || echo "The two strings are not the same"
    echo firstStr:  $firstStr
    echo secondStr: $secondStr
    

    执行结果:
    在这里插入图片描述

    6、默认变量:

    $0~$n,表示 shell 脚本的执行参数,包括 shell 脚本执行命令本身,shell 脚本执行命令本身为$0

    $#表示最后一个参数的标号

    $@表示除$0外的所有参数。

    示例:

    #!/bin/bash
    echo "The zero parameter  :"$0
    echo "The first parameter :"$1
    echo "The second parameter:"$2
    echo "The label of the last parameter:"$#
    echo "All parameters      :"$@
    

    执行结果:
    在这里插入图片描述

    7、shell 脚本条件判断:

    shell 脚本支持条件判断,虽然可以通过&&||来实现简单的条件判断,但是稍微复杂一点的场景就不适合了。shell 脚本提供了if then条件判断语句:

    if 条件判断;then
    	# 判断成立后要执行的语句
    fi				# 结束语句
    
    --------------------------------------------------------------------
    
    if 条件判断; then
    	# 条件判断后成立要执行的语句
    else
    	# 条件判断后不成立要执行的语句
    fi
    
    --------------------------------------------------------------------
    
    if 条件判断; then
    	# 条件判断后成立要执行的语句
    elif 条件判断;then		# 此语句可多次添加
    	# 条件判断后成立要执行的语句
    else
    	# 条件判断后不成立要执行的语句
    fi
    
    --------------------------------------------------------------------
    
    case $变量 in		# 与 C语言 switch case 相似
    "第一个变量内容")
    	# 程序段
    	;;		# 表示第一个程序块结束
    "第二个变量内容")
    	# 程序段
    	;;		# 表示第二个程序块结束
    "第n个变量内容")
    	# 程序段
    	;;		# 表示第 n个程序块结束
    *)			# 类似 C语言 switch case的 default
    	# 程序段
    	;;
    esac
    

    8、shell 脚本函数:

    function fname(){		# function 可写可不写
    	# 函数代码段
    }
    
    fname		# 函数调用
    
    fname param1 param2		# 函数传参
    

    函数传参用法示例:

    #!/bin/bash
    fun1(){
        echo "$0"
        echo "param1:$1"
        echo "param2:$2"
        echo "$#"
        echo "$@"
    }
    
    fun1 lcx1 lcx2
    

    执行结果:
    在这里插入图片描述
    可以看出,$n $# $@表示函数相应传参值,$0仍然表示 shell 脚本第0个参数。

    9、shell 循环

    while 条件			# 条件状态为判断式,条件成立时循环,直到条件不成立
    do					# 循环开始
    	# 循环代码段
    done
    
    --------------------------------------------------------------------
    
    until 条件			# 条件状态为判断式,条件不成立时循环,直到条件成立
    do					# 循环开始
    	# 循环代码段
    done
    
    --------------------------------------------------------------------
    
    for var in con1 con2 con3 ......
    do
    	# 循环代码段
    done
    # 变量 var 循环变化,第一次循环等于 con1,第二次循环等于 con2,以此类推
    
    --------------------------------------------------------------------
    
    for((初始值;限制值;执行步长))
    do
    	# 循环代码段
    done
    # 用法类似于 C语言 for循环
    

    for 循环示例:

    #!/bin/bash
    for name in lcx1 lcx2 lcx3
    do
        echo "name = $name"
    done
    

    执行结果:
    在这里插入图片描述for 循环了三次
    for 循环示例:

    #!/bin/bash
    for((count=0;count<=10;count++))
    do
        echo "$count"
    done
    

    执行结果:
    在这里插入图片描述

    展开全文
  • 反弹shell

    千次阅读 2022-03-09 08:24:41
    一、课时目标 1.理解shell的概念 2.理解交互式shell和非交互式shell的区别 3.掌握反弹shell的原理和方法
  • shell脚本语言(超全超详细)

    万次阅读 多人点赞 2020-04-20 22:26:20
    shell脚本语言1、shell的概述2、脚本的调用形式打开终端时系统自动调用:/etc/profile 或 ~/.bashrc3、shell语法初识3.1、定义以开头:#!/bin/bash3.2、单个"#"号代表注释当前行第一步:编写脚本文件第二步:加上可...
  • Linux中编写Shell脚本

    万次阅读 多人点赞 2018-10-08 11:22:35
    Shell Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (()) 数值运算命令的用法 let 运算命令的用法 expr 命令的用法 br 命令的用法 $[]符号的运算示例 Shell脚本的条件测试 ...
  • 常见的反弹shell的方法以及对反弹shell的解释

    千次阅读 多人点赞 2020-12-21 22:34:00
    什么是反弹shell,以及对反弹shell作用原理的解析:3.反弹shell的本质linux文件描述符重定向输入重定向输出重定向标准输出与标准错误输出重定向文件描述符的复制exec 绑定重定向对反弹shell执行的实例分析:>&...
  • andorid使用jni执行shell命令例子

    热门讨论 2014-01-09 09:32:34
    1. android上调用jni 2. 在jni里c代码中调用系统shell 3. 执行shell命令 4. 返回android应用层
  • Shell脚本备忘录

    万次阅读 2021-08-16 23:29:00
    [root@localhost testShell]# x=1024 [root@localhost testShell]# echo "x=$x" x=1024 使用 ${ } 作为单词边界 [root@localhost testShell]# x=1024 [root@localhost testShell]# echo "x=${x}-123" x=1024-123 ...
  • letter shell 3.0是一个C语言编写的,可以嵌入在程序中的嵌入式shell,主要面向嵌入式设备,以C语言函数为运行单位,可以通过命令行调用,运行程序中的函数。 优点: 使用C99语法编写,并且没有平台相关代码; ...
  • 反向shell实操

    千次阅读 2022-02-25 16:22:32
    实验一: A机器传递信息到B机器: 测试环境macOS 10.15 1、A用nc命令 listen本机一个端口号 nc -l 8000 2、B 用telnet命令 去连接A机器的ip和端口号 telnet ipA 8000 ...另一种方式:方向shell,B
  • 正向shell和反弹shell

    千次阅读 2022-03-26 11:01:21
    正向shell反弹shell的利用场景以及使用技巧
  • Shell 文件

    千次阅读 2021-09-26 18:46:06
      Shell 文件是以某种方式将一些命令放在一起得到的文件,常称为 Shell 脚本。 Shell 文件通常以“#!/bin/sh”开始, #!后面指定解释器,如下是一个简单的 Shell 文件的内容: #!/bin/sh echo "hello world!"  ...
  • 反弹Shell的方式和详解

    千次阅读 多人点赞 2020-06-18 11:47:13
    文章目录一、介绍1.1 含义1.2 目的二、反弹方式2.1 Bash反弹shell2.1.1 适用对象2.1.2 操作方法2.1.3 命令原理 声明:以下的反弹shell的介绍只适用于学习和授权情况下的操作,请勿用于非法环境! 一、介绍 1.1 ...
  • bash shell 和 dash shell 的区别,你真的了解吗? 本文将给你解开一些答案!
  • Android adb shell命令详解及实例

    千次阅读 2020-07-21 08:51:09
    Android的内核本身就是Linux,所以Android本身也支持...在手机中执行Shell命令:1) 每次都加上adb shell来进行命令的发送与执行 adb shell <command> 2)获取模拟器所有包名 adb shell pm list packages 3
  • STM32+FreeRtos 移植letter-shell工具

    千次阅读 2021-12-24 17:18:18
    Rt-thread系统有非常好用的FinSH调试工具,考虑在FreeRtos也移植一款类似的嵌入式Shell工具,经过资料查找,开源的letter-shell库满足此需求,搞起。 1、平台 开发环境:vscode+STM32CubeMX+MDKV5 芯片:STM32F...
  • Shell内值命令之exit

    千次阅读 多人点赞 2022-02-16 22:45:48
    Shell内值命令之exit 介绍: exit 用于退出当前shell环境进程结束运行,并且可以返回一个状态码.一般使用$?可以获取状态码. 语法: 正确退出语法 exit #默认返回状态码0 ,一般代表命令执行成功 错误退出语法 exit ...
  • 109 个实用 shell 脚本

    万次阅读 多人点赞 2022-02-15 10:08:39
    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来...
  • shell的正向和反向

    千次阅读 2022-02-05 13:40:04
    正向shell和反向shell 正向shell:控制端主动发起连接去连接被控制端 反向shell:被控制端主动连接控制端 在实战中,大多数采用反向shell,因为正向shell有很多因素导致连接失败, 比如说硬件设备有防火墙,入侵防御...
  • shell通配符

    万次阅读 2022-01-01 21:22:01
    各个版本的shell都有通配符,这些通配符是一些特殊的字符,用户可以在命令行的参数中使用这些字符,进行文件名或者路径名的匹配。shell将把与命令行中指定的匹配规则符合的所有文件名或者路径名作为命令的参数,然后...
  • Shell脚本函数传递参数

    万次阅读 2022-04-14 23:00:42
    如何传递参数到Shell脚本函数 通常,在其他脚本语言中,您可以将参数和参数作为function_name(parameter1, parameter2,…)传递给函数,这在shell脚本函数中不支持。在shell脚本函数中,您可以在函数调用期间直接...
  • 博主最近在项目实践过程中,需要深度定制项目的Makefile,其中有些复杂的流程必须得借助shell脚本才能高效地完成,为此博主特意深入学习了在Makefile种调用shell命令的方法。 大家都知道shell命令是Linux的神器,...
  • getshell思路

    千次阅读 2022-02-23 18:02:48
    getshell能干嘛文件上传getshell文件包含getshellsql注入getshell操作系统漏洞getshellRCE getshell总结 授人以鱼,不如授人以渔 getshell能干嘛 1.执行终端命令 2.文件管理(增删改查) 3.数据管理(增删改查,...
  • 本文主要讲解 Shell 命令合集,以及对控制台的使用技巧。在这之前你需要掌握如下三部分的知识内容:需要熟悉掌握 Linux;需要了解一些 Shell 基础,课时中会介绍一些常见的 Shell 命令合集;需要了解 TCP 三次握手...
  • 常用Linux shell命令行

    万次阅读 2021-09-11 16:06:06
    shell命令很多,只要掌握常见的即可,具体的可以用到的时候再查询 几个很好的网站: Linux 命令大全 | 菜鸟教程 https://man.linuxde.net/ 常用的一些shell命令行 1、目录信息查看命令ls ls -a 显示目录所有...
  • Shell脚本中的while循环

    千次阅读 2020-07-19 10:54:52
    Today we’ll learn about the while loop in shell scripts. Loops are an essential part of any programming language. When we write a code to execute a set of statements 15 times, writing the same ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,165,527
精华内容 2,866,210
关键字:

shell