Shell-基本命令与运算符


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

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

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

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


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


3.shell编程 (之前学习过C语言)

3.1 shell编程 对比 C编程 

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

3.2 shell脚本编程

3.2.1 shell发展简介 
    sh 
    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的测试版本。
    
    #!/bin/bash --- 表示指定当前shell脚本的解释器为 /bin/bash 这个解释器 
   【总结】
    shell脚本的本质就是一系列shell命令的集合。
    
    
3.2.2 shell脚本编写     
    1.shell脚本编写流程:
    
        1.vim XX.sh  #!/bin/bash     //编辑文件 shebang
        2.编写脚本                   //#!/bin/bash 
        3.chmod +x XX.sh             //给执行权限 
        4. ./XX.sh                   //执行文件 
        
     注意:
      #              --- 第一行 不要写注释 这些    
      #!/bin/bash    --- 表示当前这个shell脚本用哪个shell来解释执行 

所有者  所属组  其它人 
    r w x - r w x  - r w x 
    1 1 1   1 1 1    1 1 1 
    -----   -----    -----
      7       7        7    //0777 
      
    r w x - r w x  - r w x 
    1 0 1   1 1 1    1 1 1 
    -----   -----    -----
      5      7        7   //0577 


4.环境变量: env
    PATH:系统中可执行文件的路径
    PWD :当前所在的工作路径
    HOME:当前登录用户的家目录
    ...

    
    USERNAME=linux
    USER=linux
    PWD=/home/linux/shell
    HOME=/home/linux
    SHELL=/bin/bash
  PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/linux/tools/opt/FriendlyARM/toolschain/4.4.3/bin

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/binenv 
//引用环境变量:
$PATH            

echo  --- printf

键(key)值(value)对  
KEY=value 

键(key)    相当于 C语言中的 变量名 
值(value)  相当于 C语言中的 赋的值 

5.位置变量:  ./3.sh /etc/passwd 123   内置变量


main(int argc,char* argv[]) // a.out 1  2

@argc --- 命令行参数的个数
@argv --- 命令行参数对应的数组的首地址 


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

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

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

 
         (2)shell脚本输入输出
            read  name
            echo  '$name'
            a+b;

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


          
练习1:
    从终端输入两个数,并打印出这两个数
    read 
    echo 

7.read
     read从标准输入读入一行, 并赋值给后面的变量,其语法为:
   .   read  var
     把读入的数据全部赋给var
   .   read  var1  var2  var3
     把读入行中的第一个单词(word)赋给var1, 
     第二个单词赋给var2, 
     ……把其余所有的词赋给最后一个变量.
     如果执行read语句时标准输入无数据, 
     则程序在此停留等侯, 
     直到数据的到来或被终止运行。
     
    
     
read var1 var2 var3 
//此时,从键盘输入的数据,可以在一行,数据与数据间用空格隔开 

read var1 
read var2 
//此时多个数据用回车 区分 
     
     8.expr

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

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

9.分支语句:
    1.if语句 

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

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


    ((c语言风格的表达式))
    
    //双分支 
    if  ((c语言风格的表达式))
    then
        语句1
    else
        语句2
    fi //fi
    

条件的生成:
  逻辑运算 关系运算  //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

10.//条件的生成 --test的命令      //注意: test 执行结果为真  0
                             // 执行结果为假 1
    man test 
    -a and  &&
    -o or   ||
    
    test    -eq        相等   


    
    test 10 -eq $i   
    
    [ $i -eq 10 ]     
    
     man test 
         if( a == 10)
            -ne        不相等
            -gt        大于
            -lt        小于
            -ge        大于等于
            -le     小于等于
            
            
            
            [ $i -ge 0  -a $i -lt 59 ]
            
            
            0<= a <59 
            
            
        
条件的写法:        
            
  //命令的写法
  test 10 -eq $i
 
  //中括号 
  [ $i -eq 10 ]  //注意: 中括号里面,前后都要有空格。
  
  //C风格 
  (( c语言风格的表达式 ))

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

11.
        test 
        -b            块设备文件        block      test -b /dev/sda  --- 硬盘 
                 eg:
                     ls -l /dev/sda 
        -c            字符设备文件      char                         --- 鼠标,键盘 
                   
                eg:
                    ls -l /dev/input/mouse0

        -d            目录文件          directory 
        -f             普通文件          regular 
        -L            链接文件          link       类似 windows下的快捷方式 
                eg:
                    ln -s 源文件 链接文件名    
                    
        -S             套接字文件        socket     (本地socket/网络socket )
        -p            管道文件          pipe       (管道) //进程的通信  
                eg:
                   mkfifo fifo  //创建管道文件fifo 
        
   练习 5:
     从终端输入一个文件名,判断该文件的类型
    

        

  

12.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 优秀

13.循环语句://while //do-while //for 
   
   //c语言 
   while (表达式)
   {
       语句 
   }
   
   
   //shell  - test  [ ] (())
    while [  条件    ]
    do
        语句
        ...
    done

    for
    
    until


练习:
   while实现1到100求和 

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

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


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


seq命令 表示打印一系列值:
       seq LAST
       seq FIRST LAST
       seq FIRST INCREMENT LAST


练习:
   for 试下 1~100 累加求和 


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

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

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

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


   

    
    

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring基于文心一言API使用的大模型

有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录&#xff0c;点击立即体验 点击千帆大模型平台 向下滑动&#xff0c;进入到模型…

【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2022-35555 漏洞名称&#xff1a;Tenda W6 命令注入 威胁等级&#xff1a;高危 漏洞详情&#xff1…

xtuner微调internlm2-chat-1_8b--xtuner中文文档快速上手案例

xtuner微调internlm2-chat-1_8b–xtuner中文文档快速上手案例 设备&#xff1a;百度飞桨免费算力平台16GB显存 1. 安装库 conda conda create --name xtuner-env python3.10 -y conda activate xtuner-env将model的conda保存到本地防止丢失 conda env list #参考env在那个…

智慧出行与车路云一体化政策研究报告

智慧出行政策的发展趋势可以大致划分为三个阶段&#xff0c;与行业发展历程紧密相连。当前&#xff0c;智慧出行政策正逐步进入第三阶段&#xff0c;即技术融合与广泛应用阶段。这一阶段的政策发展趋势将更加注重智慧出行的全面融合和创新应用。比如智能网联技术在智慧出行层面…

民兵装备管理系统DW-S300|支持国产化、自主研发

民兵装备器材管理系统&#xff08;智装备DW-S301&#xff09;是一套成熟系统&#xff0c;依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 装备接收与登记 民兵装备抵达仓库时&#…

【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)

ps.源码放在最后面 设计IIR数字滤波器可以看这里&#xff1a;利用MATLAB配合ARM-DSP库设计IIR数字滤波器&#xff08;保姆级教程&#xff09; 前言 本篇文章将介绍如何利用MATLAB与STM32的ARM-DSP库相结合&#xff0c;简明易懂地实现FIR低通滤波器的设计与应用。文章重点不在…

服务器,交换机和路由器的一些笔记

服务器、交换机和路由器是网络中常用的设备&#xff0c;它们的本质区别和联系如下&#xff1a; 本质区别 功能不同 服务器&#xff1a;就像一个大型的资料仓库和工作处理中心&#xff0c;主要用来存储和管理各种数据&#xff0c;比如网站的网页数据、公司的办公文档等&#x…

SpringCloud - Gateway 网关

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://spring.io/projects/spring-clou…

【vs2022配置cursor】

Cursor搭配cmake实现C程序的编译、运行和调试的参考地址 cursor下载地址 第一步&#xff1a; 电脑上按爪cmake 第二步&#xff1a;cursor 配置 安装中文 第三步环境变量&#xff1a; D:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.35.322…

C#/.NET/.NET Core技术前沿周刊 | 第 24 期(2025年1.27-1.31)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

【STM32】通过HAL库Flash建立FatFS文件系统并配置为USB虚拟U盘MSC

【STM32】通过HAL库Flash建立FatFS文件系统并配置为USB虚拟U盘MSC 在先前 分别介绍了FatFS文件系统和USB虚拟U盘MSC配置 前者通过MCU读写Flash建立文件系统 后者通过MSC连接电脑使其能够被操作 这两者可以合起来 就能够实现同时在MCU、USB中操作Flash的文件系统 【STM32】通过…

用语言模型探索语音风格空间:无需情感标签的情 感TTS

用语言模型探索语音风格空间&#xff1a;无需情感标签的情感TTS 原文&#xff1a;Exploring speech style spaces with language models: Emotional TTS without emotion labels 今天我们要说的是 一种无需情感标签的情感TTS。提出了一个基于FastSpeech2的E-TTS框架&#xff0…

基于Ubuntu2404搭建k8s-1.31集群

k8s 1.31 环境初始化安装Container安装runc安装CNI插件部署k8s集群安装crictl使用kubeadm部署集群节点加入集群部署Calico网络配置dashboard 本实验基于VMware创建的Ubuntu2404虚拟机搭建k8s 1.31版本集群&#xff0c;架构为一主一从&#xff0c;容器运行时使用Container&#…

linux的三剑客和进程处理

Linux三剑客&#xff1a; grep&#xff1a;查找 sed&#xff1a;编辑 awk&#xff1a;分析 grep - 正则表达式 [rootlocalhost ~]# grep ^a hello.txt abc grep - 忽略大小写&#xff0c;还有一些场景需要查询出来对应字符串所在的行号&#xff0c;方便我们快速在文件中定位字…

渗透利器:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.&#xff08;主动扫描被动扫描&#xff09; Burp Suite 和 Xray 联合使用&#xff0c;能够将 Burp 的强大流量拦截与修改功能&#xff0c;与 Xray 的高效漏洞检测能力相结合&#xff0c;实现更全面、高效的网络安全测试&#xff0c;同时提升漏…

时间序列分析(三)——白噪声检验

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 一、相关知识点 白噪声的定义&#xff1a;白噪声序列是一种在统计学和信号处理中常见的随机过程&#xff0c;由一系列相互独立、具有相同…

CEF132编译指南 MacOS 篇 - 构建 CEF (六)

1. 引言 经过前面一系列的精心准备&#xff0c;我们已经完成了所有必要的环境配置和源码获取工作。本篇作为 CEF132 编译指南系列的第六篇&#xff0c;将详细介绍如何在 macOS 系统上构建 CEF132。通过配置正确的编译命令和参数&#xff0c;我们将完成 CEF 的构建工作&#xf…

deepseek + kimi 高效生成PPT

1.在deepseek中生成ppt大纲 2.将大纲复制到kimi中生成PPT kimi&#xff1a;https://kimi.moonshot.cn/

CSS 属性选择器详解与实战示例

CSS 属性选择器是 CSS 中非常强大且灵活的一类选择器&#xff0c;它能够根据 HTML 元素的属性和值来进行精准选中。在实际开发过程中&#xff0c;属性选择器不仅可以提高代码的可维护性&#xff0c;而且能够大大优化页面的样式控制。本文将结合菜鸟教程的示例&#xff0c;从基础…

【嵌入式Linux应用开发基础】read函数与write函数

目录 一、read 函数 1.1. 函数原型 1.2. 参数说明 1.3. 返回值 1.4. 示例代码 二、write 函数 2.1. 函数原型 2.2. 参数说明 2.3. 返回值 2.4. 示例代码 三、关键注意事项 3.1 部分读写 3.2 错误处理 3.3 阻塞与非阻塞模式 3.4 数据持久化 3.5 线程安全 四、嵌…