Shell 脚本(Bash 版)

0x01 概述

(1)Shell 简介

  • Shell 是一个命令行解释器

    flowchart LR 用户输入命令-->接收并将命令传递给内核执行-->将命令执行的结果返回给用户
  • Shell 种类丰富,包括 sh、csh、ksh、bash、zsh、fish 等

    • 以下内容使用的是 bash(Bourne Again Shell)
    • Linux 系统中默认安装的是 bash
    • Windows 中使用的是 PowerShell,可以通过 WSL 或 Git Bash 在 Windows 系统中使用 bash

(2)查看 Shell 相关信息

  • cat /etc/shells:查看系统中所有的 Shell 版本
  • echo $SHELL:当前系统默认使用的 Shell,类似形式的命令有:
    • echo $0:查看当前正在执行的脚本名称
    • echo $HOME:查看当前用户的家目录
    • echo $PATH:查看系统的查找路径

(3)编写 Shell 脚本

  • 对于需要批量执行的命令,可以保存在 Shell 脚本中,从而实现自动化

  • Shell 脚本文件的扩展名一般为 .sh,也可以是其它扩展名

  • 编写脚本:

    1. 新建脚本文件

      touch hello.sh
      
    2. 使用 Vi 编辑脚本

      vi hello.sh
      
    3. i 键进入编辑模式(Vi 编辑器使用方法见Vim 安装与基础操作指南 | 博客园-SRIGT

    4. 第一行一般是用于指定使用的 Shell 种类

      #!/bin/bash
      
    5. 之后写入需要执行的命令,默认自上向下依次执行

      echo "Hello, shell script"	# 文本输出
      date	# 日期与时间
      whoami	# 当前用户名
      
    6. 依次按 [ESC]:wq 保存脚本并退出 Vi 编辑器

    7. 使用命令 chmod a+x hello.sh 修改脚本文件执行权限

    8. 使用命令 ./hello.sh 执行该脚本

  • Shell 脚本中,支持使用条件语句、循环语句、函数、局部变量等

    • 举例:素数判断脚本

      #!/bin/bash
      is_prime() {
          local num=$1
          if [ $num -lt 2 ]; then
              return 1
          fi
      
          for ((i=2; i*i<=num; i++)); do
              if [ $((num % i)) -eq 0 ]; then
                  return 1
              fi
          done
          return 0
      }
      
      read -p "输入一个正整数: " number
      if is_prime $number; then
          echo "$number 是素数"
      else
          echo "$number 不是素数"
      fi
      

0x02 脚本基础

案例:使用 bash 编写 Shell 脚本实现“猜数游戏”

(1)输入与输出

#!/bin/bash

read -p "输入用户名: " name
echo "欢迎,$name"
  • read -p "提示内容" 变量名
  • echo "输出内容 $变量名"
#!/bin/bash

name=$1
echo "欢迎,$name"
  • 使用命令 ./game.sh SRIGT 执行脚本并设置第一个参数为 SRIGT
  • name=$1:将第一个参数赋值给变量 name
    • $1~$n 分别表示第 \(n\) 个参数
    • $#:传递给脚本或函数位置参数的个数
    • $*:传递给脚本或函数的位置参数,双引号包围时作为一个整体
    • $@:传递给脚本或函数的位置参数
    • $$:当前 Shell 进程的 PID
    • $!:最后一个后台命令的 PID
    • $?:上一命令的退出状态码

(2)变量

  • 定义环境变量

    name=SRIGT
    echo $name
    
  • 在 Shell 脚本中使用环境变量的值

    export name=SRIGT
    
    # game.sh
    #!/bin/bash
    
    echo "欢迎,$name"
    
  • 将自定义的环境变量永久保存

    cd /etc/bash
    vi bash.bashrc
    
    # bash.bashrc
    # 在文件的最后写入以下内容
    export name=SRIGT
    
    source bash.bashrc
    . bash.bashrc
    

(3)随机数

number=$(shuf -i 1-10 -n 1)
  • shuf -i 生成范围 -n 生成个数

  • 在 Shell 脚本中,须要使用 $(命令) 或反引号将命令作为一个整体来处理

number=$((RANDOM % 10 + 1))
  • $RANDOM:会随机生成 \(0-32767\) 之间的随机数

(4)条件判断

if [[ $guess -eq $number ]]; then
        echo "猜中了"
elif [[ $guess -lt $number ]]; then
        echo "猜小了"
elif [[ $guess -gt $number ]]; then
        echo "猜大了"
else
        echo "猜错了"
fi
  • 条件判断语法

    if condition; then
    	# 语句
    elif condition; then
    	# 语句
    else
    	# 语句
    if
    
  • 条件测试表达式 condition 可以是:

    • []:最基本的条件测试表达式
    • [[]]:扩展测试命令
    • (()):数学表达式,支持加减乘除等常见的数学运算

(5)循环

while true
    do
    read -p "输入1-10之间的数字作为猜数: " guess
    if [[ $guess -eq $number ]]; then
        read -p "猜中了, 是否继续(y/n)" choice
        if [[ $choice = "y" ]] || [[ $choice = "Y" ]]; then
            number=$(shuf -i 1-10 -n 1)
            continue
        else
            break
        fi
    fi
    done
  • for 循环语法:

    for ((condition 1; condition 2; condition 3)); do
    	# 语句
    done
    
  • while 循环语法:

    while condition
    do
    	# 语句
    done
    
  • continue:继续循环

  • break:跳出循环

完整代码

#!/bin/bash

echo "欢迎,$name"
number=$(shuf -i 1-10 -n 1)
while true
    do
    read -p "输入1-10之间的数字作为猜数: " guess
    if [[ $guess -eq $number ]]; then
        read -p "猜中了, 是否继续(y/n)" choice
        if [[ $choice = "y" ]] || [[ $choice = "Y" ]]; then
            number=$(shuf -i 1-10 -n 1)
            continue
        else
            break
        fi
    elif [[ $guess -lt $number ]]; then
        echo "猜小了"
    elif [[ $guess -gt $number ]]; then
        echo "猜大了"
    else
        echo "猜错了"
    fi
    done

-End-

posted @ 2024-04-30 13:16  SRIGT  阅读(20)  评论(0编辑  收藏  举报