shell编程(脚本问题先看有没有空格)

一,shell入门

  1. 什么是shell

    1. 不要把简单问题复杂化,不要把shell当编程语言
    2. 我说shell不是编程语言的原因就在这里,4个点就是shell全部,和传统编程不一样的。)
      1. 变量:可以定义和使用变量来存储数据。
      2. 条件语句:可以使用 ifcase 等条件语句来控制代码的执行流。
      3. 循环:支持 forwhileuntil 等循环结构来重复执行代码块。
      4. 函数:可以定义和调用函数来组织和重用代码。
    3. 最好每个部分都有空格,比如,变量与符号之间,a = b + c
    4. 常见的shell:
      1. Bourne Shell(/usr/bin/sh或/bin/sh)
      2. Bourne Again Shell(/bin/bash)
        1. 最常用的shell是Bash,也就是Bourne Again Shell。Bash由于易用和免费,在日常工作中被广泛使用,也是大多数Linux操作系统默认的Shell环境。
      3. C Shell(/usr/bin/csh)
      4. K Shell(/usr/bin/ksh)
      5. Shell for Root(/sbin/sh)
    5. 什么是shell
      1. 你可以把她(是的,当她是女生时候,我会一直操作她)当做一个软件
  2. shell编程注意事项

    1. shell 命名:Shell脚本名称命名一般为英文、大写、小写,后缀以.sh 结尾
    2. 不能使用特殊符号、空格
    3. 见闻之意,名称要写的一眼可以看出功能
    4. shell 编程 首行需要 #!/bin/bash 开头
    5. shell 脚本 变量 不能以 数字、特殊符号开头,可以使用下划线_,但不能 用破折号 -
  3. 第一个shell脚本hello world

    1. touch hello_world.sh#创建一个shell文件
    2. vim hello_world.sh#进入文件编辑
      1. #!/bin/bash
        #这句话表示告诉系统去bin中找bash执行这个文件
        echo "hello world"
        #echo 是一个输出语句,输出后面的东东
    3. ./Helloword.sh#执行文件,当然用户权限不够,要改权限
    4. 芜湖,不错,是不是简单的很,我敢说比py还简单。

二,shell环境变量讲解

  1. shell变量详解

    1. # 什么是变量
      1. 就是房间(酒店的),声明变量就是告诉系统,说“‘嗨,给我来一块内存空间,我要存东西’”,你去酒店说:“老板来间房,我要睡觉。”而变量名就是房间号。
    2. # 常见的3种变量
      1. Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量
      2. 变量名由大小写字母,下划线,数字任意组合,但是下划线不开头
    3. #举个王八,哈哈哈开玩笑,举个pear
  2. shell系统变量,介绍

    1. 主要是用于对参数判断和命令返回值判断时使用
      1. $0 当前脚本的名称;
      2. $n  表示当前脚本的第 n 个参数,n 的值可以是 1 到 9。
      3. $* 当前脚本的所有参数(不包括程序本身);
      4. $# 当前脚本的参数个数(不包括程序本身);
      5. $? 令或程序执行完后的状态,返回0表示执行成功;
      6. $$ 程序本身的PID号。
    2. #!/bin/bash
      echo "第一个参数: $1"
      echo "第二个参数: $2"
      echo "第三个参数: $3"
      

  3. shell环境变量,介绍

    1. #Shell常见的变量之二环境变量,主要是在程序运行时需要设置,环境变量详解如下:
      
      PATH  		命令所示路径,以冒号为分割;
      HOME  		打印用户家目录;
      SHELL 		显示当前Shell类型;
      USER  		打印当前用户名;
      ID    		打印当前用户id信息;
      PWD   		显示当前所在路径;
      TERM  		打印当前终端类型;
      HOSTNAME    显示当前主机名;
      PS1         定义主机命令提示符的;
      HISTSIZE    历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;
      RANDOM      随机生成一个 0 至 32767 的整数;
      HOSTNAME    主机名
      #我在之前的脚本后添加了一个echo $PATH
  4. shell用户环境变量

    1. 用户变量又称为局部变量,主要用在Shell脚本内部或者临时局部使用
    2. 记得酒店房间吗?就是为这个准备的。
    3. 当我设置了局部变量,然后关闭终端再打开就会发现,变量没了
    4. 对了,echo是打印语句,字符操作界面中可以良好的告诉你,一件事的到了哪一步了,当然图形化跟直接,但是没有字符的细节。
    5. echo -e 扩展
      1. 转义字符
        转义字符说明示例
        \n换行echo -e "Hello\nWorld"
        \t水平制表符(Tab 键)echo -e "Hello\tWorld"
        \\输出反斜杠 \echo -e "Hello\\World"
        \b退格(删除前一个字符)echo -e "Hello\bWorld"
        \r回车(将光标移动到行首)echo -e "Hello\rWorld"
        \a发出警报音echo -e "\a"
        \v垂直制表符echo -e "Hello\vWorld"
        \0NNNASCII 编码对应的字符(八进制)echo -e "\041"(输出 !
        \xNNASCII 编码对应的字符(十六进制)

        echo -e "\x21"(输出 !

      2. 常见颜色代码

        颜色前景色代码背景色代码
        黑色3040
        红色3141
        绿色3242
        黄色3343
        蓝色3444
        紫色3545
        青色3646
        白色3747

        文字样式代码

        样式代码
        重置样式0
        加粗1
        斜体3
        下划线4
        反显7
        隐藏8
      3. #字符颜色与格式操作
        echo -e "\e[【字符样式代码】;颜色代码m文本内容\e[0m"
        #\e[ 或 \033[:表示开始使用 ANSI 转义序列。
        #颜色代码:指定颜色的代码。
        #m:表示结束颜色代码的部分。
        #\e[0m:表示重置颜色,恢复到默认状态。
        利用上面代码做了个变色的hello world

三,shell编程流程控制语句以及函数

  1. if条件语句介绍

    1. 1. 单分支 if 语句
      ············································
      if 条件; then
          # 条件为真时执行的命令
      fi
      ············································
      示例:
      ············································
      if [ -f /etc/passwd ]; then
          echo "文件存在"
      fi
      2. 双分支 if-else 语句
      ············································
      if 条件; then
          # 条件为真时执行的命令
      else
          # 条件为假时执行的命令
      fi
      ············································
      示例:
      ············································
      if [ -d /home/user ]; then
          echo "/home/user 目录存在"
      else
          echo "/home/user 目录不存在"
      fi
      3. 多分支 if-elif-else 语句
      ············································
      if 条件1; then
          # 条件1为真时执行的命令
      elif 条件2; then
          # 条件2为真时执行的命令
      else
          # 条件1和条件2都不为真时执行的命令
      fi
      ············································
      示例:
      ············································
      if [ "$1" -eq 1 ]; then
          echo "输入的是1"
      elif [ "$1" -eq 2 ]; then
          echo "输入的是2"
      else
          echo "输入的不是1或2"
      fi
      ············································
      4. 嵌套 if 语句
      可以在 if 语句内部嵌套另一个 if 语句。
      ············································
      示例:
      ············································
      if [ -d /home/user ]; then
          if [ -f /home/user/file.txt ]; then
              echo "文件存在"
          else
              echo "文件不存在"
          fi
      else
          echo "目录不存在"
      fi
      ············································
      5. 条件测试符
      ············································
      -f 文件:判断文件是否存在并且是普通文件。
      -d 目录:判断是否是目录。
      -e 文件:判断文件或目录是否存在。
      -n 字符串:判断字符串是否非空。
      -z 字符串:判断字符串是否为空。
      数值1 -eq 数值2:判断两个数是否相等。
      数值1 -gt 数值2:判断数值1是否大于数值2。
      ············································
      注意事项:
      ············································
      条件必须用方括号 [] 或双括号 [[]] 包围,且要注意方括号与条件之间的空格。
      then 可以与 if 同行写,但必须用分号隔开,例如:if 条件; then。
      1. 文件判断符号
       判断符号	解释
      -e 文件名	判断文件或目录是否存在
      -f 文件名	判断是否是普通文件
      -d 目录名	判断是否是目录
      -r 文件名	判断文件是否有读权限
      -w 文件名	判断文件是否有写权限
      -x 文件名	判断文件是否有执行权限
      -s 文件名	判断文件是否非空
      -L 文件名	判断是否是符号链接
      -p 文件名	判断是否是命名管道
      -c 文件名	判断是否是字符设备文件
      -b 文件名	判断是否是块设备文件
      2. 字符串判断符号
       判断符号	解释
      -z 字符串	判断字符串是否为空
      -n 字符串	判断字符串是否非空
      字符串1 = 字符串2	判断两个字符串是否相等
      字符串1 != 字符串2	判断两个字符串是否不相等
      字符串1 < 字符串2	判断字符串1是否小于字符串2(按字典顺序)
      字符串1 > 字符串2	判断字符串1是否大于字符串2(按字典顺序)
      3. 整数判断符号
       判断符号	解释
      整数1 -eq 整数2	判断两个整数是否相等
      整数1 -ne 整数2	判断两个整数是否不相等
      整数1 -gt 整数2	判断整数1是否大于整数2
      整数1 -ge 整数2	判断整数1是否大于或等于整数2
      整数1 -lt 整数2	判断整数1是否小于整数2
      整数1 -le 整数2	判断整数1是否小于或等于整数2
      4. 逻辑判断符号
       判断符号	解释
      ! 表达式	逻辑非,取反
      表达式1 -a 表达式2	逻辑与,表达式1 和 表达式2 同时为真时为真
      表达式1 -o 表达式2	逻辑或,表达式1 或 表达式2 任意一个为真时为真
      5. 双方括号 [[]] 中的运算符
      双方括号 [[]] 支持更多操作符,并且对字符串比较更加直观。
      
       判断符号	解释
      [[ $var == pattern ]]	模式匹配,支持通配符 *,?
      [[ $var =~ regex ]]	使用正则表达式匹配
      [[ $str1 > $str2 ]]	字符串比较,判断 $str1 是否大于 $str2(按字典顺序)
      [[ $str1 < $str2 ]]	字符串比较,判断 $str1 是否小于 $str2(按字典顺序)

  2. for循环语句介绍

    1. 基本语法:
      ············································
      for 变量 in 列表; do
          # 循环体
      done
      ············································
      C 风格语法:
      ············································
      for (( 初始化; 条件; 更新 )); do
          # 循环体
      done
      ············································
      文件名迭代:
      ············································
      for 文件 in /path/to/directory/*; do
          # 循环体
      done
      ············································
      命令输出迭代:
      ············································
      for 变量 in $(命令); do
          # 循环体
      done
      ············································
      数组迭代:
      ············································
      for 变量 in "${数组[@]}"; do
          # 循环体
      done
      ············································
      break 和 continue 控制:
      ············································
      for 变量 in 列表; do
          if [ 条件 ]; then
              break   # 退出循环
          fi
          if [ 条件 ]; then
              continue  # 跳过当前循环的剩余部分
          fi
          # 循环体
      done
      #!/bin/bash
      #遍历目录
      for dir in $(ls /etc/);do
      echo $dir
      done
      ------------------------
      #当然还有这种的
      for dir in /etc/*;do
      echo $dir
      done
      #选一个就行了
       
  3. while循环语句介绍

    1. 1. 基本 while 语法
      ············································
      while [ 条件 ]; do
          # 循环体
      done
      2. 读取文件
      ············································
      while IFS= read -r line; do
          # 处理每一行
      done < 文件名
         IFS=:设置内部字段分隔符为空,防止 read 命令截断行首和行尾的空白字符。
             如果:IFS="a" read -r variable对于grape就返回$variable=grpe
                  while IFS="a" read -r field1 field2对于grape就返回$field=gr $field2=pe 
         read -r line:从文件中读取一行并将其赋值给变量 line,-r 选项确保读取时不解释反斜杠作为转义字符。
         done < 文件名:< 文件名 表示将文件的内容逐行读入循环。
      3. 无限循环
      ············································
      while true; do
          # 循环体
      done
      4. 使用 break 退出循环
      ············································
      while [ 条件 ]; do
          if [ 条件 ]; then
              break
          fi
      done
      5. 使用 continue 跳过循环
      ············································
      while [ 条件 ]; do
          if [ 条件 ]; then
              continue
          fi
      done
      #!/bin/bash
      while IFS='a' read -r v1 v2;do
      echo "字段1:$v1;字段2:$v2"
      done < $1

  4. case选择语句介绍

    1. case 变量 in
          模式1)
              # 当变量匹配模式1时执行的命令
              ;;
          模式2)
              # 当变量匹配模式2时执行的命令
              ;;
          模式3)
              # 当变量匹配模式3时执行的命令
              ;;
          *)
              # 默认情况,当没有其他模式匹配时执行的命令
              ;;
      esac
      
       模式1, 模式2, 模式3:用于匹配 变量 的模式,支持通配符 * 和 ?。
       [0-9]也支持
       ;;:表示当前模式匹配完成后的结束符。
       *):默认分支,相当于 else,匹配其他未列出的情况。
       esac:case 语句的结束标志,相当于 fi 结束 if 语句。
      #!/bin/bash
      case $1 in
      *.txt)
      echo "文本文件"
      ;;
      *.png|*.jpg)
      echo "图形文件"
      ;;
      *.sh)
      echo "脚本文件"
      ;;
      *)
      echo "其他文件"
      ;;
      esac

  5. select选择语句介绍

    1. select 变量 in 选项1 选项2 选项3 ...; do
          # 根据用户选择执行相应的操作
          break  # 通常会在执行完操作后退出循环
      done
      select 选择语句在 Bash 脚本中用于创建一个简单的交互式菜单,让用户从多个选项中选择。它特别适合用于需要让用户通过菜单输入选择的情况。
      变量:存储用户选择的选项的值。
      选项1 选项2 ...:显示给用户的多个选项列表。
      do ... done:循环体,用于执行相应的操作,直到满足某个条件(如使用 break 退出循环)。
      ctrl+d:强制退出
      #!/bin/bash
      select a in a b c d e f; do
          if [ "$a" = "a" ]; then
              echo "你选择了 $a"
          elif [ "$a" = "b" ]; then
              echo "你选择了 $a"
          elif [ "$a" = "c" ]; then
              echo "你选择了 $a"
          elif [ "$a" = "d" ]; then
              echo "你选择了 $a"
          elif [ "$a" = "e" ]; then
              echo "你选择了 $a"
          else
              echo "无效选择"
          fi
      done
      

  6. shell函数,数组编程

    1. Shell 函数
      1. 定义函数的语法:
      ························································
      function 函数名() {
          # 函数体
          # 一些命令
      }
      ························································
      或:
      ························································
      函数名() {
          # 函数体
          # 一些命令
      }
      ························································
      2. 函数的调用:
      ························································
      函数名  # 直接调用函数
      ························································
      3. 示例函数:
      ························································
      #!/bin/bash
      
      # 定义函数
      greet() {
          echo "Hello, $1!"
      }
      
      # 调用函数并传递参数
      greet "World"
      ························································
      Shell 数组
      ························································
      1. 定义数组:
      Shell 支持一维数组,数组中的元素可以是字符串或数字,索引从 0 开始。
      ························································
      # 定义数组
      arr=("元素1" "元素2" "元素3")
      ························································
      # 或
      ························································
      arr[0]="元素1"
      arr[1]="元素2"
      arr[2]="元素3"
      ························································
      2. 访问数组元素:
      ························································
      echo ${arr[0]}  # 输出数组第一个元素
      ························································
      3. 访问整个数组:
      ························································
      echo ${arr[@]}  # 输出数组的所有元素
      ························································
      4. 获取数组长度:
      ························································
      echo ${#arr[@]}  # 输出数组的长度
      ························································
      5. 添加或修改数组元素:
      ························································
      arr[3]="元素4"  # 添加新元素到数组中
      arr[1]="新元素2"  # 修改已有元素
      ························································
      6. 遍历数组:
      ························································
      for i in "${arr[@]}"; do
          echo $i
      done
      #!/bin/bash
      #结合函数的遍历数组
      arr=(1 2 3 4 5)
      a="buhao"
      #全局变量
      get(){
      echo $a
      local a="nhao"
      #local 关键字用于声明局部变量。局部变量只在函数的作用域内有效,函数执行完毕后就会销毁,不会影响全局的环境。
      for i in ${arr[@]};do
      echo $i
      done
      }
      
      get
      
      echo $a
      
      #变量赋值的时候不可以有空格

    2. ${array[@]}${array[*]} 的区别

      1. ${array[@]}:遍历数组常用

        1. 将数组的每个元素作为独立的参数传递。例如,在循环中使用时,每个数组元素会被单独处理。
        2. 对于数组元素中包含空格的情况,它会保留每个元素的完整性。
          1. arr=("one" "two three" "four")

            for item in "${arr[@]}"; do
                echo "$item"
            done
            输出
            one
            two three
            four

      2. ${array[*]}:输出整个数组作为字符串

        1. 将数组的所有元素作为一个单一的字符串传递。如果数组元素之间有空格,则整个数组会被合并成一个字符串。
        2. 默认情况下,元素之间由第一个字符 $IFS(内部字段分隔符)分隔(通常是空格)。
          1. arr=("one" "two three" "four")

            echo "${arr[*]}"
            输出
            one two three four

总结

        人生何处不如意,换一处再回头,不过是去年黄昏伤人心,今朝明日依犹在。

                                                                                                                ——叶子

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值