• shell编程扩展-----bash编程


    前言

    • bash是许多Linux平台内定的shell。

    • 其名字来源于最初为Unix写bash脚本的作者Steve Bourne。

    • 1.历史命令 history 上下键 .bash_history

    • 2…命令与文件补全 TAB键

    • 3.命令别名设置 alias alias lm=‘ls -al’

      1. 任务管理,前后台控制 如& 或者ctrl-C
      1. 程序脚本 交互性好,脚本文件
      1. 通配符 ls –l /usr/bin/M*
        ls –l /use/bin/M??.txt

    bash示例

    程序示例:文件名为 hello.sh,目录为/home/wxhd

    1 #! /bin/bash
    2 # Filename : hello
    3 echo "Hello World! “

    bash程序解释

    第1行:“#!”符号

    • 通常在Linux系统脚本的第一行开头,指明了执行这个脚本文件的解释程序,如果默认的脚本就是bash,那么可以写成:#!/bin/sh
      • 如果“#!”之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。
      • 如果“#!”指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前shell去执行。
      • 如果解释程序没有可执行权限,则会报错;如果“#!”指定的解释程序不存在,那么也会报错。

    第2行:注释行用“#”开头。

    第3行:执行的bash命令

    执行时,首先查看当前用户是否对此文件具有执行权限,如果没有,则需要使用chmod命令来修改,然后执行。

    bash程序执行

    • 修改权限shell命令:
      [wxdh@主机名]$ chmod 777 hello.sh
    • 执行命令:[wxdh@主机名]$ ./hello.sh
    • 结果:在终端显示Hello World!字符串。
      在这里插入图片描述

    在这里插入图片描述

    变量

    变量功能

    • 每个用户登录系统都可以获得一个bash shell,例如:每个人都能使用bash执行mail命令获取邮件。
      在这里插入图片描述

    • Bash是如何得知你的邮箱是哪个文件?
      需要变量来帮忙。
      变量:让某一个特定字符串代表不固定的内容。 y=a+b

    变量可变性

    • mail变量

    在这里插入图片描述

    • 当dmtsai用户登录,获取MAIL变量内容为 /var/spool/mail/dmtsai
    • 当root用户登录,获取MAIL变量内容为 /var/spool/mail/root

    影响bash环境操作的变量

    PATH变量

    • 能否在任何目录下执行某个命令,与PATH变量有很大关系。
    • 执行ls命令时,系统就是通过PATH这个变量中的内容所记录的路径顺序来查找命令的。
      在这里插入图片描述

    变量设置规则

    (1)自定义变量:

    • 用户自定义的变量由字母、数字和下划线组成,并且变量名的第一个字符不能为数字,且变量名大小写敏感。
    • 例如,定义变量name的值为Jane:
      name=Jane
    •  注意:bash不能在等号两侧留空格。
      
      • 1

    在这里插入图片描述

    (2)环境变量:

    • 可以用set命令给变量赋值或查看环境变量值
    • 使用unset命令清除变量值
    • 使用export导出变量即可使其它进程访问到该环境变量。

    (3)位置变量:

    • 位置变量对应于命令行参数,主要向脚本传递数据,其中$0为脚本名称, 1 为第一个参数,以此类推,参数超过 9 个必须使用 1为第一个参数,以此类推,参数超过9个必须使用 1为第一个参数,以此类推,参数超过9个必须使用{}引用变量。
    • shell保留这些变量,不允许用户以另外的方式定义它们,传给脚本或函数的位置变量是局部和只读的,而其余变量为全局的。

    (4)其它变量

    在这里插入图片描述

    • $n   $0代表命令本身,$1-9代表接受的第1-9个参数,10以上需要用{}括起来,比如 ${10}代表接收的第10个参数
    • $* 代表接收所有的参数,将所有参数看作一个整体
    • $@ 代表接收的所有参数,将每个参数区别对待
    • $# 代表接收的参数个数
      在这里插入图片描述

    引号

    在这里插入图片描述

    操作符

    (1)字符串操作符(替换操作符)

    在这里插入图片描述

    (2)模式匹配操作符

    在这里插入图片描述

    示例

    程序示例:字符串操作符
    [wxdh@主机名]$ name=”hello”
    [wxdh @主机名]$ echo $name ${var:-”world”}!
    hello world!
    [wxdh @主机名]$ echo $name ${var:+”world”}!
    hello !
    [wxdh @主机名]$ echo $name ${var:=” wxdh”}!
    hello wxdh!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    条件和test命令

    • bash可以使用[ … ]结构或test命令测试复杂条件。
      格式为:

    •   [ expression ] 或 test expression
      
      • 1
    • 注意:左括号后和右括号前空格是必须的语法要求。

    • 返回一个代码,表明条件为真还是为假,如果返回0则为真,否则为假。

    (1)文件测试操作符

    在这里插入图片描述

    (2)字符串操作符

    在这里插入图片描述

    (3)整数操作符

    在这里插入图片描述

    (4)逻辑操作符

    在这里插入图片描述

    示例:判断两个字符串之间的关系

    • [wxdh@主机名]$ test “abc” = “def” ; echo $?
      1
    • [wxdh @主机名]$ [ “abc” != “def” ]; echo $?
      0
    • [wxdh @主机名]$ [ “abc” < “def” ]; echo $?
      0
    • [wxdh @主机名]$ [ “abc” > “def” ]; echo $?
      1
    • [wxdh @主机名]$ [ “abc” <“abc” ]; echo $?
      1
    • [wxdh @主机名]$ [ “abc” > “abc” ]; echo $?
      1

    shell流控制

    (1)条件语句:if

    • 语法:
      if 条件 then 语句
      [elif 条件 then 语句]
      fi

    在这里插入图片描述

    (2)确定性循环:for

    • 语法:
      for value in list
      do 语句
      done

    在这里插入图片描述

    (3)不确定性循环:while和until

    • 语法:while条件 do语句
      done
    • 提示:如果条件的执行结果为0,或条件判断为真时,执行循环体内的命令。
    • 语法:until 条件 do 语句
      done
    • 提示:其判断条件和while正好相反,即条件返回非0,
      或条件为假时,执行循环体内的命

    (4)选择结构:case

    • case语法:case 表达式 in 表达式和模式
      模式1 )
      语句;; 允许表达式和含有通配符的模式进行匹配
      模式2 )
      语句;;
      esac

    (5)选择结构:select

    • select语法:select value [ in list ]
      do 若没有list则默认为位置变量
      statements using $value
      done

    示例

    程序示例:对输入的不同后缀的文件做不同的处理。

    #! /bin/bash
    for filename in "$@"; do 
      case $filename in 
        *.jpg )    exit 0 ;; 
        *.tga )    echo$filename is a tga file”;; 
        *.xpm )  echo$filename is a xpm file” ;; 
        *.pcx )    echo$filename is a pcx file”;; 
        *.tif )      echo$filename is a tif file”;; 
        *.gif )      echo$filename is a gif file”;; 
        * )          echo "procfile: $filename is an unknown graphics file." 
        exit 1 ;; 
      esac 
    done 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    函数定义

    函数定义:

    function fname() {
    commands commands
    }

    函数调用:

    fname [ parm1 parm2 parm3 … ]

    • 说明:函数在使用前定义,函数名和调用函数参数成为函数的位置变量。在函数或脚本中,可以使用bash特殊变量来引用参数,可以给这些变量附上$符号的前缀,然后像引用其它 shell 变量那样引用它们。

    函数参数说明

    在这里插入图片描述

    示例

    程序示例:函数输入参数示例:

    程序示例:函数输入参数示例:
    [wxdh@主机名]$ testfunc () { 
    >echo "$# parameters“
     >echo "$@>}                [wxdh @主机名]$ testfunc
                          0 parameters
                          [wxdh @主机名]$ testfunc a b c
                          3 parameters
                          a b c
                         [wxdh @主机名]$ testfunc a "b c"
                         2 parameters
                         a b c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    关于函数的差异处理

    在这里插入图片描述

    示例

    程序示例: 函数输出参数。

     function myfunc(){
        local  myresult='some value'
            echo "$myresult"
            }
            result=$(myfunc)   # or  result=`myfunc` (此处为反引号)
            echo $result
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果:输出“some value”。

    总结

    • shell是操作系统为使用者提供的软件或命令解析器。
    • 通常我们所说的shell指的是命令行式shell,其执行方式分为交互式模式和非交互式模式。
    • 常用的文本编辑器包括Vi编辑器、Vim编辑器、Emacs编辑器等,其中,几乎所有Linux版都自带Vi编辑器。
    • bash是使用最多的shell之一,也是许多Linux平台内定的shell,它有变量、操作符、条件和流控制,以及函数,可以为系统管理等编写很复杂的程序。
    • bash是一个常用脚本
  • 相关阅读:
    【机器学习300问】68、随机初始化神经网络权重的好处?
    以clion为例记录一次基于docker环境配置开发
    java毕业设计Steam游戏平台系统(附源码、数据库)
    共识算法 Raft
    路由不变,页面刷新
    【C++】C++11—— 包装器
    OpenCV图像处理学习十三,图像金字塔——高斯金字塔和拉普拉斯金字塔
    Pr:导出设置之字幕
    【网络安全】--win提权
    视频号小店所需资金明细,2023最新费用详解!
  • 原文地址:https://blog.csdn.net/weixin_51422230/article/details/127132496