嵌入式技术学习——Linux环境编程(高级编程)——shell编程

news2024/12/27 11:23:42

一、shell编程的基础介绍


1.为什么要进行shell编程?
在Linux系统中,虽然有各种各样的图形化接口工具,但是shell仍然是一个非常灵活的
工具。
Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。

您可以通过使用shell使大量的任务自动化,

因此,之所以要使用Shell 脚本是基于:
1、简单性
Shell 是一个高级语言,通过它,你可以简洁地表达复杂的操作。
2、可移植性
使用POSIX 所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。
3、开发容易
可以在短时间内完成一个功能强大又好用的脚本。
//参考:《Shell 脚本学习指南》

#shell特别擅长:
系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。


2.谁需要学习 Shell 编程?
Linux运维工程师:
    编写Shell程序进行服务集群管理。
Python和JavaEE程序员:
    编写Shell脚本程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
大数据程序员:
    编写Shell程序来管理集群。Shell 是什么?
//我们怎么用:
//做简单配置 
//能看懂别人的脚本 
//eg: 
//  后面双网卡的配置

3、shell程序的作用:保护Linux内核,提供一个与用户交互的界面

图形化shell

命令行shell

 

二、shell编程的应用

3.shell编程 (之前学习过C语言)
3.1 shell编程 对比 C编程 
shell编程: (1.执行过程,2.开发效率,3.执行效率,4.移植性)  
    解释型语言  
        边翻译边执行 (ls cp(程序))
        擅长文件处理,操作系统管理
        开发效率高  cp 1 2
        执行效率低    
        移植性好
    .c
    编译型语言
        先编译再执行   //gcc 编译 (.c ---> 机器代码) 
        擅长数据计算和数据处理
        开发效率低
        执行效率高
        
        移植性差
        
        
cp 1 2 
    
    rw-   rw- r--
    --x
3.2 shell脚本编程

3.2.1 shell发展简介 
    bash shell gnu   unix 
    c shell  csh
    k shell  ksh ash 
    ...
    我们用的是:
    bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。
    同时,Bash 也是大多数Linux 系统默认的 Shell。
    在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,
    所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
    
    [注]:
    Bash (the Bourne-Agian shell)由 Brian Fox 为GNU项目编写,目的是代替sh。
    首次发布于1989年,作为GNU项目的一个程序广泛分布在Linux、Mac OS X、Cygwin上。Brain Fox作为FSF的员工,首次开始工作是在1988年的1月10号,一年之后,发布了.99的测试版本。
    【总结】
    shell脚本的本质就是一系列shell命令的集合

3.2.2 shell脚本编写     
    1.shell脚本编写流程:
        1.vim XX.sh  #!/bin/bash     //编辑文件 
        2.编写脚本
        3.chmod +x XX.sh             //给执行权限 
        4. ./XX.sh                   //执行文件 
        
     注意:
          #    --- 第一行 不要写注释 这些     

文件类型 所属用户权限  所属组  其他人       
-           rw-        rw-     r--

chmod +x  1.sh 
chmod 


    
//chmod - ls -l  权限位     
    chmod  +x 
    chmod  0777 01.sh  
    
    r w x - r w x  - r w x 
    1 1 1   1 1 1    1 1 1 
    -----   -----    -----
      7       7        7 
      
    r w x - r w x  - r w x 
    0 0 1   1 1 1    1 1 1 
    -----   -----    -----
      1       7        7     
      

变量/分支语句/循环语句/【*数组/函数】 


    
    2.shell变量  
        1.环境变量: env
            PATH:保存当前工作的默认路径
            PWD :当前所在的工作路径
            HOME:当前登录用户的家目录
            ...
        
        
        
        HOME=/home/linux
        PWD=/home/linux/2021code/shell/test_code
        USER=linux
        SHELL=/bin/bash
        PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/linux/tool/opt/FriendlyARM/toolschain/4.5.1/bin:/home/linux/Qt5.5.1/Tools/QtCreator/bin
        
        
        env 
        //引用环境变量:
        $PATH           
        
        echo 
        
        键(key)值(value)对  
        KEY=value 
       

 2.位置变量:  ./3.sh /etc/passwd 123   内置变量
        main(int argc,char* argv[]) // a.out 1  2
        
        @argc --- 命令行参数的个数
        @argv --- 命令行参数对应的数组的首地址 

 

#include<stdio.h>


//argc b表示命令行参数的个数
//argv 表示 命令行参数对应字符数的首地址
//字符串参数地址 

int main(int argc, const char *argv[])
{
	printf("argc=%d\n",argc);
	int i =0;
	while(argv[i]!=NULL)
	{
		printf("argv[%d] = %s\n",i,argv[i]);
		++i;
	}
	
	return 0;
}

     
        
    
             $0:脚本文件名
            $1:传入脚本的第一个参数
            $2:传入脚本的第二个参数
            ...
            $9:
            ls /etcpass 
            cp /etc/passwd 123 ;
            
            
            $#:传入参数的个数
            
            $?:上一句shell命令执行的结果
               0 表示成功 
            $$:当前shell的PID --- $$ 21694 //进程的概念提示  
            进程 ---- 进行中程序(process id--进程的身份证号)              
        
     

//[说明]:
表 1 位置参数变量
位置参数变量    作 用
$n    n 为数字,$0 代表命令本身,$1〜$9 代表第 1〜9 个参数,10 以上的参数需要用大括号包含, 如${10}
$*    这个变量代表命令行中所有的参数,把所有的参数看成一个整体
$@    这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
$#    这个变量代表命令行中所有参数的个数


       
        3.自定义的变量:
        注意:
            (1).shell中数据是弱类型,默认识别为字符串类型         
            (2).不需要,先定义
            (3).名字规则 ,遵循C的命名规则。 //(不要带空格)    
                不能带 $符号 
                [注]
                 给值的时候 等号两边不能有空格 
                 var=123 (√)
                 var = 123 (x) 
            

echo ~ printf
read --表示从哪个键盘获取输入             
                              
            
        3.shell脚本输入输出
            read  name
            echo  '$name'
            a+b;

        4.shell中的引号
       "   ":打印字符串,遇到$变量($name)则打印变量中的值(name变量的值)
        '  ':打印字符串,遇到$变量依然打印 $变量 (原样输出)
        ` `:将中间的字符串按照命令打印   (命令置换)
          
 

     5、输入

read
     read从标准输入读入一行, 并赋值给后面的变量,其语法为:
   .   read  var
     把读入的数据全部赋给var
   .   read  var1  var2  var3
     把读入行中的第一个单词(word)赋给var1, 
     第二个单词赋给var2, 
     ……把其余所有的词赋给最后一个变量.
     如果执行read语句时标准输入无数据, 
     则程序在此停留等侯, 
     直到数据的到来或被终止运行。         
        
练习1:
    从终端输入两个数,并打印出这两个数
    read 
    
    echo  

6、shell上运算

//字符串不能进行运算,需要专门命令 expr 
运算:
expr             
expr 
算术运算命令expr主要用于进行简单的整数运算,
#注意:
     (1).符号两边要有空格
     (2).注意对应的运算符是否需要转义 

包括:
    加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。
  
    
    例如:

  $ expr  12  +  5  \*  3
  27
  $ expr  3  -  8  /  2
  -1

  $ num=9
  $ sum=`expr  $num  \*  6 `
  $ echo  $sum
  54
 
练习2:
     四则运算的结果

双引号里面可以嵌套单引号的命令置换

6、分支语句:
    1.if语句

     if (表达式)
     {
        语句1;     
     }
     else 
     {
        语句2;
     }

    
    //双分支 
        if 条件
        then
            语句1
        else
            语句2
        fi //fi


        
        /*
        if  
        fi --if的倒着写  
        */

条件的生成:
  逻辑运算 关系运算  //C中 
  
  
          if 条件
        then
            语句1
        else
            语句2
        fi //fi


        
        

        

    //多分支 
    if 条件表达式
    then
        语句 
    elif [条件表达式]  #else if (表达式)
    then 
        语句 
    elif [条件表达式]
    then
       语句 
    else 
       语句 
    fi
    
    //单分支 
    if [ $i -eq 10  -a $j -le 10 ]
    then
    
    fi

//条件的生成 --test的命令      //注意: test 执行结果为真  0
                             // 执行结果为假 1
    man test 
    -a and  &&
    -o or  ||
    
    test    -eq        相等   
    test 10 -eq $i     [ $i -eq 10 ]      if( a == 10)
            -ne        不相等
        
            -gt        大于
            -lt        小于
            -ge        大于等于
            -le     小于等于
            [ $i ge 0  -a $i lt 59 ]
            
  //命令的写法
  test 10 -eq $i
 
  //中括号 
  [ $i -eq 10 ]  //注意: 中括号里面,前后都要有空格。
  
  //C风格 
  (( c语言风格的表达式 ))
  
           

练习 3:
    从键盘输入两个数,比较大小,输出较大的值。


    

//多行注释 
:<<!

...

/* */


练习 4:  
    if 实现 成绩的打印            
    从终端接收一个成绩
        0 - 59 打印不及格 
        60 - 69    及格
        70 - 79    良好
        80 - 89    中等
        90 - 100 优秀
        
        
 $num -ge 0 -a $num -lt 60

(( num >= 0 && num < 60)) 

数据有效性:
0~100 
<0 
>100 
        
        
        
        
说明:
    成绩的打印 
    90~100 
    
    逻辑关系:
    -a ==> and(且)
    -o ==> or (或)    
    90 -ge $score 
   //条件 分数 在 90 到 100 之间
   [ 90 -ge $score  -a $score -le 100 ]  // ???? [  $score -ge 90  -a $score -le 100 ]  
   


     
    hello oellh
        test 
        -b            块设备文件        block      test -b /dev/usb0 --- 硬盘  //ls -l/dev/sad
        -c            字符设备文件      char                         --- 鼠标,键盘 // ls -l /dev/input/mice
        -d            目录文件          directory 
        -f             普通文件          regular 
        -L            链接文件          link       类似 windows下的快捷方式   //ln -s 源文件 目标文件
        -S             套接字文件        socket     (本地socket/网络socket )
        -p            管道文件          pipe       (管道) //进程的通信    mkfifo pipe

练习 5:
    从终端输入一个文件名,判断该文件的类型

练习 6:
    从终端输入一个文件名,如果该文件存在,
    则修改其权限为777,如果该文件不存在,
    则在当前目录创建tmp文件夹,并在文件夹下
    创建该文件并修改权限为777

    

    
    2.case
    
    
    switch(n)
    {
        case 1:
             ...
             break;
             
        default:
             ...
             break;
    }
    
    
    //shell 
        case $num in 
            9)语句
                ;;  //C中的 --- break
            8|6|5|4)语句
                ;;  //C中的 break 
            7)语句
                ;;
            *)语句 //default 
                ;;
        esac  //esac --->case 反着写 
        
        
            
练习 7:  80 
            从终端接收一个成绩,
                0 - 59    不及格
                60 - 69 及格
                70 - 79    中等
                80 - 89    良好
                90 - 100 优秀
            
    

test  
expr      
                
                
    
循环语句:
   
    while [  条件    ]
    do
        语句
        ...
    done

    for
    
    until

for 循环:
for循环一般格式为:

//c
for (表达式1;表达式2;表达式3)
{
    语句;
}

//shell 
for var in item1 item2 ... itemN  //for循环的条件 
do                                //for循环的执行体
    command1
    command2
    ...
    commandN
done

//C语言风格的:
格式
for((exp1; exp2; exp3))
do
    statements
done
语法:((表达式1,表达式2…))

特点:
1、在双括号结构中,
所有表达式可以像c语言一样可以进行计算,
如:a++,b--等。
2、在双括号结构中,
所有变量可以不加入:“$”符号前缀。

如下所示:
-----------------------------------------------
#!/bin/bash

for name in "Tom" "Lily" "Kate"
do
    echo $name
done

for ((i=0;i<=5;i++))
do
    echo $i
done
-----------------------------------------------
#for i in 1 2 3 4 5
#do
#    echo $i
#done

//-------------------------
eg:
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done
//-------------------------
eg: seq 例子  //man seq 
#!/bin/bash 

i=0
sum=0

#for i in {1..100}
#for ((i = 0; i < 101; i++))
for i in `seq 100`
do
    sum=`expr $sum + $i`
done

echo "i = $i, sum = $sum"

while 循环:
一般格式:
while condition
do
    command
done


实例eg:
#!/bin/bash
int=1
while(( $int<=5 )) //C的形式 
do
    echo $int
    let "int++"
done

以下是一个基本的 while 循环,测试条件是:
如果 int 小于等于 5,那么条件返回真。
int 从 1 开始,每次循环处理时,int 加 1。
运行上述脚本,返回数字 1 到 5,然后终止。

    
until 
语法格式:
until condition
do
    command
done

condition 一般为条件表达式,
如果返回值为 false,
则继续执行循环体内的语句,否则跳出循环。
以下实例我们使用 until 命令来输出 0 ~ 9 的数字:

实例
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done


作业:
1.练习 5:  if-else  test 
    从终端输入一个文件名,判断该文件的类型

2.练习 6:
    从终端输入一个文件名,如果该文件存在,
    则修改其权限为777,如果该文件不存在,
    则在当前目录创建tmp文件夹,并在文件夹下
    创建该文件并修改权限为777
3.1~100求和
  for 
  while 
  until 


sudo dpkg -i *.deb 
sudo ./*.sh 
vi -t EIO 

  


 

       

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

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

相关文章

群辉NAS与电脑间的文件自动同步

目录 一、套件简介 二、套件的安装 三、电脑端程序 (1)启用团队文件夹 (2)设置同步任务 (3)测试同步 四、手机同步 (1)安装app (2)测试 (3)同步任务 (3)其它同步任务 最早使用的网盘叫“快盘”,不知道朋友们有用过的没有。当时最常用的功能就是电脑与…

相交链表(Leetcode)

题目分析&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 相交链表&#xff1a;首先我想到的第一个思路是&#xff1a;如图可知&#xff0c;A和B链表存在长度差&#xff0c;从左边一起遍历链表不好找交点&#xff0c;那我们就从后面开始找&#xff0c;但是这是单链表&…

期望23K,go高级社招面试复盘

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 我最终还是上岸了&#xff0c;花了一周总结了3万字的go社招高级面试知识体系思维导图&#xff0c;分享出来希望能帮助有缘人吧&#xff0c;以下只是…

AI金融投资:批量下载巨潮资讯基金招募说明书

打开巨潮资讯的基金招募说明书页面&#xff1a; http://www.cninfo.com.cn/new/fulltextSearch/full?searchkey%E5%B0%81%E9%97%AD%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E8%AF%81%E5%88%B8%E6%8A%95%E8%B5%84%E5%9F%BA%E9%87%91%E6%8B%9B%E5%8B%9F%E8%AF%B4%E6%98%…

如何配置node.js环境

文章目录 step1. 下载node.js安装包step2. 创建node_global, node_cache文件夹step3.配置node环境变量step3. cmd窗口检查安装的node和npm版本号step4. 设置缓存路径\全局安装路径\下载镜像step5. 测试配置的nodejs环境 step1. 下载node.js安装包 下载地址&#xff1a;node.js…

Windows下MySQL数据库定期备份SQL文件与删除历史备份文件.bat脚本

目录 一、功能需求 二、解决方案 (1)新建文件夹及批处理文件 (2)编写备份脚本 ①完整脚本 ②参数修改 (3)编写定期删除备份脚本 ①根据文件名识别日期进行删除 ② 根据文件的修改日期删除 (4)设置定时器 (5)常见报错与处理 一、功能需求 在Windows系统下…

【吊打面试官系列-Mysql面试题】SQL 语言包括哪几部分?每部分都有哪些操作关键字?

大家好&#xff0c;我是锋哥。今天分享关于 【SQL 语言包括哪几部分&#xff1f;每部分都有哪些操作关键字&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; SQL 语言包括哪几部分&#xff1f;每部分都有哪些操作关键字&#xff1f; SQL 语言包括数据定义(DDL)、…

Linux PXE高效批量装机

部署PXE远程安装服务 在大规模的 Linux 应用环境中&#xff0c;如 Web 群集、分布式计算等&#xff0c;服务器往往并不配备光驱设备&#xff0c;在这种情况下&#xff0c;如何为数十乃至上百台服务器裸机快速安装系统呢?传统的USB光驱、移动硬盘等安装方法显然已经难以满足需…

「Python-docx 专栏」docx设置罗马数字页码,即页码编码格式为罗马数字

本文目录 前言一、docx 设置罗马数字页码1、docx设置大写罗马数字的页码①、docx背后的xml长啥样②、<w:sectPr> 标签详解③、通过<w:sectPr> 设置大写罗马数字的页码A、完整代码B、处理效果图C、这段代码实际上的作用2、docx设置小写罗马数字的页码①、完整代码②…

ABAP-03基础数据类型

基本数据类型 数据类型默认大小&#xff08;byte&#xff09;有效大小初始值说明示例C11-65535SPACE文本字符&#xff08;串&#xff09;‘Name’N11-65535‘00…0’数字文本‘0123’T66‘000000’时间(HHMMSS)‘123010’D88‘00000000’日期(yyyymmdd)‘20090901’I4-231~232…

ELISA Flex: Monkey IFN-γ (HRP)

ELISA Flex: Monkey IFN-γ (HRP)该ELISA试剂盒能够检测溶液样本比如细胞培养上清或者血清/血浆中猴子γ干扰素&#xff08;IFN-γ&#xff09;的含量。 产品组分&#xff1a; 捕获抗体&#xff1a;克隆号MT126L&#xff08;0.5mg/ml&#xff09; 检测抗体&#xff1a;克隆号7…

mamba模型原理解读

本文主要讲解我对于2023年提出的mamba模型的理解和解读&#xff0c;mamba模型的提出为transformer模型存在的计算效率低下&#xff0c;需要大量时间运行程序提出了解决方案。提高了模型的运行效率和计算效率。我主要是根据下面这篇文章入手&#xff1a; 1.mamba模型是通过堆叠多…

数据分析必备:一步步教你如何用matplotlib做数据可视化(6)

1、Matplotlib 网格 axes对象的grid()函数将图中网格的可见性设置为on或off。还可以显示网格的主要/次要(或两者)刻度。另外&#xff0c;可以在grid()函数中设置color&#xff0c;linestyle和linewidth属性。 参考以下示例代码 import matplotlib.pyplot as plt import numpy…

网安人必备!开源网络安全工具TOP 10(附下载地址)

工欲善其事&#xff0c;必先利其器。对于广大的网络安全从业者&#xff0c;以及未来想要从事网络安全的人来说&#xff0c;选择并善用合适的网络安全工具&#xff0c;能有效提升工作效率。 开源网络安全工具之所以能够在众多安全解决方案中脱颖而出&#xff0c;不仅是因为它们…

若依RuoYi-Vue分离版—富文本Quill的图片支持伸缩大小及布局

若依RuoYi-Vue分离版—富文本Quill的图片支持伸缩大小及布局、工具栏带中文提示 1.在vue.config.js 文件中添加 一下内容2.下载安装插件3.在Editor组件中引入插件4.使用Editor组件&#xff08;特别注意要的加 v-if &#xff09;5.bug 之 imageResize的 img的style丢失1.先创建一…

minSdkVersion、targetSdkVersion、compileSdkVersion三者的作用解析

minSDK和targetSDK&#xff0c;这两者相当于一个区间。你能够用到targetSDK中最新的API和最酷的新功能&#xff0c;但又需要向后(向下)兼容到minSDK&#xff0c;保证这个区间内的设备都能够正常的执行你的APP。换句话说&#xff0c;想使用Android刚刚推出的新特性&#xff0c;但…

桥梁施工监测:科技守护,让施工更稳更安全!

桥梁作为重要的交通设施&#xff0c;其安全性和稳定性不容忽视。在施工过程中&#xff0c;进行严格的监测成为确保桥梁质量的关键。本文将深入探讨桥梁施工监测的核心内容、流程以及技术优势&#xff0c;并通过实际案例展示其应用效果。 一、监测内容概览 环境因素监测&#xf…

【DAMA】掌握数据管理核心:CDGA考试指南

引言&#xff1a;        在当今快速发展的数字化世界中&#xff0c;数据已成为组织最宝贵的资产之一。有效的数据管理不仅能够驱动业务决策&#xff0c;还能提升竞争力和市场适应性。DAMA国际一直致力于数据管理和数字化的研究、实践及相关知识体系的建设。秉承公益、志愿…

红海云CEO孙伟获2024“新锐企业家”荣誉

近日&#xff0c;由羊城晚报报业集团联合广东软件行业协会主办的“2024广东软件风云榜”活动圆满落下帷幕&#xff0c;红海云CEO孙伟以新技术、新业态、新模式&#xff0c;带领企业取得创新发展&#xff0c;荣膺2024广东软件风云榜“新锐企业家”称号。 为把握广东省数字经济和…

关于Panabit在资产平台中类型划分问题

现场同事问了一个问题&#xff1a;Panabit能不能当做CentOS接入&#xff1f; 我第一反应是&#xff1a;Panabit是个什么鬼&#xff1f;为啥要混编接入&#xff1f;后期维护都是事啊。所以&#xff0c;我就想回答&#xff1a;不能&#xff01; 但是&#xff0c;最好要给出一个…