bash脚本

本文介绍了Bash编程中的变量设置、条件判断(if-else语句),以及如何在Linux中使用For、While循环和crontab实现开机启动时的脚本操作,如检查PCIe板卡和硬盘状态。脚本示例展示了如何监控特定硬件配置并自动重启至达到特定次数。
摘要由CSDN通过智能技术生成
  • 一、变量设置

  • 在Bash中定义变量的基本格式是:
  • variable_name=value
  • variable_name是你想要创建的变量名,value是你要赋予变量的值;示例:
  •  定义一个字符串变量:my_variable="Hello, World!"
  • 定义一个整数变量:my_number=42
  •  定义一个变量并引用另一个变量的值:another_variable="$my_variable something extra"
  •  定义一个变量并使用命令替换赋值(命令的结果作为值):file_contents=$(cat somefile.txt
  • 备注:
  1.  变量名和等号之间不能有空格。
  2. 变量名不能以数字开头,也不能包含特殊字符(除下划线 `_` 之外)。
  3. 引用变量时,使用美元符号 `$$`,例如:echo "$my_variable"。
  4. 若要在变量值中包含特殊字符或保留字,应使用双引号 `""` 包围变量值,以避免立即展开或特殊处理。例如:path="/home/user/my directory"。
  • 二、条件判断

  1. 在Bash 中使用if语句进行条件判断,基本格式如下:

    if [ condition ]; then

    # 如果条件成立(条件返回true):则执行这里的命令序列 command1·····

    else # 如果条件不成立(条件返回false)

    则执行这里的命令序列 command2·····

    fi #收尾

    这里的condition是一个表达式,可以是各种测试命令或表达式,包括但不限于文件测试、整数比较、字符串比较等;条件表达式的两边都需要加上方括号 [ 和 ],中间用空格隔开各个部分

  2. 示例:

  • if [ "$a" -eq "$b" ]; then

    echo "a and b are equal"

    elif [ "$a" -gt "$b" ]; then

    echo "a is greater than b"

    else echo "a is less than or equal to b"

    fi

    备注:这里是对整数变量 $a 和 $b 进行比较。-eq 表示等于,-gt 表示大于。

    对于字符串比较,可以使用=, !=, -z(字符串长度为0),-n(字符串长度不为0)等测试条件

    if [ "$str1" = "$str2" ]; then   

    echo "str1 and str2 are the same"

    elif [ -z "$str1" ]; then   

     echo "str1 is empty"5

    fi

    if [[ condition ]]; then

    # 使用双括号 [[ ]] 可以支持更多的条件表达式和字符串模式匹配 # 例如,文件存在性检查、正则表达式匹配等

    if [[ -f "/path/to/file" ]]; then

    echo "The file exists"

     fi

    fi

    备注:条件判断中的空格很重要,特别是在[和条件之间的空格,以及条件和其他关键字之间的空格。同时,使用[[...]]时,内部的某些条件判断可以省略两侧的双引号,但为了防止意外拼接或参数扩展,推荐对包含变量或特殊字符的字符串依然使用双引号包围

    if [ condition1 ]

    then    

    # 当 condition1 成立时执行这里的命令

    elif [ condition2 ]

    then   

    # 如果 condition1 不成立且 condition2 成立时执行这里的命令

    else   

     # 如果前面的所有条件都不成立时执行这里的命令

    fi

  • 三、计数,循环

    For循环(遍历列表、序列或其他集合)
  • arr=("apple" "banana" "cherry")

    for fruit in "${arr[@]}"; do   

    echo "Fruit: $fruit"10done

  • 这里的 @ 就是让循环能够获取数组中的每一个单独的元素,并在每次循环迭代中将其赋值给变量。

  • While循环(基于条件反复执行)

  • Until循环(直到条件变为真时停止)

  • 四、开机启动

  1.  crontab 
  2. 图形界面下使用 gnome-session-properties
  3. 计算机关机以后,再次自动启动系统。
  • 备注:系统关机,再次自动启动系统,需要配合主板bios使用,主板bios需要支持定时启动,如下:
  • 再/etc/rc.d/rc.local 中写入hwclock --set --date="2023-04-01 12:00:00"
  • #每次开机自动执行此命令,更改bios时间,然后再bios里设置“12.10.00”,基本可以实现关机以后10分钟后重启(循环),某些测试条件下可以用到。
  • 五、范例

  • 环境介绍

  • 计算机外接二块pcie测试板卡,每块板卡上面有4快硬盘,反复重启,观察是否存在“掉盘”得现象。
  • 脚本思路

  1. 每次开机检查lspci信息(检查测试版卡是否存在)并保存信息日志(叠加保存)以及检查硬盘数量。
  2. 如果测试版卡不存在或是硬盘数量不对,那么计算机停止重启;否则计算机继续重启,重启次数100次。
  • 脚本

#!/bin/bash
LOG_dmesg="/var/log/dmesg_log"
dmesg -T | grep -E "error|0x40" >> $LOG_dmesg
echo "===========================================================" >> $LOG_dmesg
LOG_pci="/var/log/lspci_log"
date "+%Y-%m-%d %H:%M:%S" && lspci -n -s 04:00.0 -vvv | grep Width >> $LOG_pci
date "+%Y-%m-%d %H:%M:%S" && lspci -n -s 08:00.0 -vvv | grep Width >> $LOG_pci
echo "===========================================================" >> $LOG_pci
#上述是定义两个变量,分别把相关dmesg、lspci信息重定向到这两个变量。
reboot_total=100
reboot_cnt=$(cat /root/disk_test/reboot_count)
if (( "$reboot_cnt" < "$reboot_total" ));then
incremented_count=$((reboot_cnt + 1))
echo $incremented_count > /root/disk_test/reboot_count
#上述计算机重启100次,计数设定。
pci4=$(lspci | grep -c "04:00.0")
pci8=$(lspci | grep -c "08:00.0")
disk_cnt=$(lsblk  | grep "sd[b-z]" | wc -l)
fi
#定义变量,pcie板卡以及硬盘数量。
if [[ "$pcie4" != 0 && "$pcie8" != 0 && "$disk_cnt" == 8 ]]; then
sleep 10
reboot

#三个条件同时满足得情况下,执行重启。
fi
备注:脚本从windows 拷贝到linux后,使用dos2unix ***.sh 转换一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值