Linux shell脚本

shell脚本概述:

Linux shell脚本是一种在Linux和Unix系统中使用的脚本语言,它允许用户通过编写脚本来自动化任务和执行命令序列。Shell脚本通常使用Bourne Shell(sh)或Bourne Again Shell(bash)编写,但也可以适用于其他shell,如ksh、zsh等。

1. 定义和用途

  • 定义:Shell脚本是由一系列的命令组成的文本文件,这些命令可以被Shell顺序执行。
  • 用途:自动化系统管理任务、文件操作、程序编译、文本处理、日志分析等。

2. Shell类型

  • Bourne Shell(sh):最初的Unix shell。
  • Bourne Again Shell(bash):sh的增强版,是大多数Linux发行版的默认shell。
  • C Shell(csh):提供类似C语言的语法。
  • Korn Shell(ksh):提供与sh的兼容性和额外的功能。
  • Z Shell(zsh):提供ksh的兼容性,以及许多增强功能。

 脚本基本语法元素

  • Shebang行

  • 脚本通常以shebang行开始,指定解释器的路径:
  • #!/bin/bash
  • 变量

  • 在Shell中,变量的作用域是全局的,除非使用局部变量声明
  • shell变量不支持数据类型,他将任意赋值给变量的数据当作字符串识别
  • 1.变量类型

  • 局部变量:在脚本或函数中定义,只在当前脚本或函数中有效。

  • 环境变量:对系统上的所有程序都可见,包括脚本。通常在/etc/profile~/.bashrc等配置文件中设置。
  • 特殊变量
  • $0:脚本的名称。
  • $1$2、...:传递给脚本的参数。$1是第一个参数,依此类推。
  • $#:传递给脚本的参数个数。
  • $*:所有参数列表,将所有参数看作一个整体。
  • $@:所有参数列表,将每个参数区分开来。
  • $?:上一个命令的退出状态码。
  • 2.定义变量:

  • 使用等号=来定义变量,不需要在变量名和等号之间加空格
  • variable_name="value"
  • 3.使用变量:

  • echo $variable_name
  • 注释

  • # 开头的行被视为注释:
  • # 这是一个注释
  • 命令

  • 直接写在脚本中,按顺序执行。
  • 直接在脚本中编写命令,就像在终端中一样:

  • ls -l
  • 功能性语句:

  • 1.read [选项] [变量...]

  • 参数说明:

  • 选项:可以用于控制 read 命令的行为,如设置分隔符、限制输入长度等。
  • 变量:一个或多个变量名,用于存储输入的数据。如果未指定变量名,输入的数据将被存储在默认变量 REPLY 中。
  • 常用选项:
  • -s:隐藏输入,用于输入密码或其他敏感信息。
  • -a array:将输入的单词读取到数组中。
  • -d delimiter:设置输入的定界符,默认为空格。
  • -n N:读取 N 个字符。
  • -p prompt:在读取之前显示提示信息。
  • -u N:从文件描述符 N 中读取数据。
  • 注意事项:

  • 如果没有指定变量,read 将使用默认变量 REPLY
  • 使用 read 读取时,输入的空格默认作为分隔符,除非使用 -d 选项指定了其他定界符。
  • read 命令在遇到定界符或行尾时停止读取。
  • 在脚本中使用 read 可以方便地实现与用户的交互。
  • 2.算数运算(expr)

  • 用于执行简单的算术运算和字符串操作
  • 格式1:expr 第一个操作数 运算符 第二个操作数
  • 格式2:((expression))
  • #!/bin/bash
    
    # 算术运算
    sum=$(expr 3 + 5)
    echo "Sum: $sum"
  • 3.test

  • 格式1:test expression
  • 格式2:[ expression ]
  • 注意事项:

  • 若是用到=,=两边要有空格

  • 在使用方括号 [[ ... ]] 时,内部的条件表达式可以更复杂,支持模式匹配和正则表达式。
  • 引号 " 用于确保变量替换时字符串不被拆分。
  • 某些条件运算符(如 -a 和 -o)在 [[ ... ]] 中使用时不需要转义。
  • 使用 test 或 [[ ... ]] 可以避免调用外部程序,这在脚本编写中是推荐的做法。
  • 对整数:
  • 对字符串:
  • 对文件:

test 是Shell脚本中实现条件判断的重要工具,它提供了一种灵活的方式来评估各种表达式和条件。

  • 数组

  • Shell数组允许你在Shell脚本中存储多个值,并在需要时引用它们。与传统编程语言中的数组不同,Shell数组有两种主要形式:一维数组和关联数组(在某些Shell中,如bash)。

  • 一维数组:

  • 一维数组在Shell脚本中是通过空格分隔的字符串列表。以下是一维数组的基本操作:

  •  1.定义一维数组(shell数组中元素的类型可以不一样)
  • array=(element1 element2 element3 ...)
  •  2.访问数组元素:
  • 使用下标访问数组元素,下标从0开始:

    echo ${array[0]} # 输出第一个元素
    echo ${array[1]} # 输出第二个元素
  • 3.获取数组长度:
  • shell没有内置的方法来直接获取数组长度,但可以通过以下方法计算:

  • length=${#array[@]}
    echo $length # 输出数组元素的数量
  • 4.遍历数组
  • 使用循环遍历数组的所有元素:

  • for element in "${array[@]}"; 
    do
        echo $element
    done
  • 5.增添元素
  • 对数组元素的增加,直接使用 数组名[下标]=数值
  • $array[i]=value
  • 6.删除元素
  • 使用unset,格式为 unset 数组名[下标],如果不带下标,则删除数组的全部元素
  • 示例代码
  • #!/bin/bash
    
    # 一维数组示例
    numbers=(1 2 3 4 5)
    echo "第一个数字是: ${numbers[0]}"
    
    # 获取一维数组长度
    length=${#numbers[@]}
    echo "数组长度是: $length"
    
    # 遍历一维数组
    for num in "${numbers[@]}"; do
      echo $num
    done
  • 关联数组(bash 4.0+)

  • shell中还提供了一种关联性数组,在使用关联数组前,必须先使用 declare -A 进行声明
  • 关联数组允许使用键值对存储数据,而不是简单的索引。

  • 1.定义关联数组
  • 使用`declare -A`关键字定义关联数组:

  • declare -A assoc_array
  • 2.添加元素到关联数组
  • assoc_array[key]=value
  • 3.访问关联数组元素
  • 使用键来访问关联数组的元素:

  • echo ${assoc_array[key]}
  • 4.获取关联数组的长度
  • 获取关联数组中的键的数量:

  • length=${#assoc_array[@]}
    echo $length # 输出关联数组中的键的数量
  • 5.遍历关联数组
  • 遍历关联数组的键和值:

  • for key in "${!assoc_array[@]}"; 
    do
        echo "$key: ${assoc_array[$key]}"
    done
    示例代码:
  • # 关联数组示例
    declare -A person
    person[name]="Alice"
    person[age]=30
    
    # 访问关联数组元素
    echo "名字: ${person[name]}"
    echo "年龄: ${person[age]}"
    
    # 遍历关联数组
    for key in "${!person[@]}"; do
      echo "$key: ${person[$key]}"
    done
  • Shell数组是处理多个值的强大工具,可以在脚本中用于各种任务,如数据存储、循环处理等。

  •  流程控制

  • -a 且的关系连接多个表达式
  • -o 或的关系连接多个表达式
  • if语句:

  • if [ 表达式1 ]
    then      
        命令块1 
    elif [ 表达式2 ]
    then     
        命令块2
    elif [ 表达式n ]
    then     
        命令块n
    else     
    命令块other
    fi
  • 示例代码
  • ​
    #!/bin/bash
    
    # 检查变量是否为空
    if [ -z "$var" ]
    then
      echo "var is empty"
    elif [ -n "$var" ]
    then
      echo "var is not empty"
    else
      echo "This else clause will never be executed"
    fi
    
    ​
  • case语句:

  • case  字符串变量  in    
    模式1)        
        命令列表1        
        ;;    
    模式2)        
        命令列表2        
        ;;    
    模式3)        
        命令列表3        
        ;;       
    *)        
        命令列表n
    esac  
  • 功能:找到字符串变量匹配的模式,并执行对应的命令列表。若所有模式都不匹配,则默认执行 *中的命令列表n。
  • 循环语句

  • for循环:

  • for variable in list
    do
      # 命令
    done
  •  while循环:

  • while [ condition ]
    do
      # 命令
    done
  • until循环:

  • until [ condition ]; do
      echo "Looping"
    done
  • 函数:

  • 函数是一组可以重复使用的命令序列。使用函数可以提高脚本的组织性、可读性和可维护性
  • 1.函数定义:

  • 格式一:function  函数名()
    {    
        命令1    
        命令2    
        ...
    }
    格式二:函数名()
    {    
        命令1    
        命令2    
        ...
    }
  • 2.函数调用:

  • 方法1:通过$?获得函数的返回值
  • 函数名 参数1 参数2$? 获得return返回值
  • 方法2:通过echo来获得函数的结果
  • 变量=`函数名 参数1 参数2`
  • 注意:此种方法是函数中的内容是通过echo输出,把echo输出的内容保存在变量中
  • 示例代码:

  • #!/bin/bash
    
    # 全局变量
    global_var="I'm global"
    
    my_function() {
      # 局部变量
      local local_var="I'm local"
    
      echo "Inside function: $local_var"
      echo "Inside function: $global_var"
    }
    
    my_function
    echo "Outside function: $global_var"
  • 输入和输出重定向

  • 使用><>>2>等来重定向输入和输出:

  • echo "Hello" > file.txt # 输出到文件 
    cat < file.txt # 从文件读取
  • 管道

  • 使用管道|将一个命令的输出连接到另一个命令的输入:

  • ls | grep "pattern"
  • shell脚本的运行方式

  • 方式一

  • 示例代码:1. test_02.sh1、建立XX.sh文件

  • 2、赋予shelll文件执行权限

  • 3、执行shell文件 ./XX.sh

  • 方式二

  • 1、建立XX.sh文件

  • 2、赋予shelll文件执行权限

  • 3、bash + XX.sh

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值