-
一、变量设置
- 在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
- 备注:
- 变量名和等号之间不能有空格。
- 变量名不能以数字开头,也不能包含特殊字符(除下划线 `_` 之外)。
- 引用变量时,使用美元符号 `$$`,例如:echo "$my_variable"。
- 若要在变量值中包含特殊字符或保留字,应使用双引号 `""` 包围变量值,以避免立即展开或特殊处理。例如:path="/home/user/my directory"。
-
二、条件判断
-
在Bash 中使用if语句进行条件判断,基本格式如下:
if [ condition ]; then
# 如果条件成立(条件返回true):则执行这里的命令序列 command1·····
else # 如果条件不成立(条件返回false)
则执行这里的命令序列 command2·····
fi #收尾
这里的condition是一个表达式,可以是各种测试命令或表达式,包括但不限于文件测试、整数比较、字符串比较等;条件表达式的两边都需要加上方括号 [ 和 ],中间用空格隔开各个部分。
-
示例:
-
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循环(直到条件变为真时停止)
-
四、开机启动
- crontab
- 图形界面下使用 gnome-session-properties
- 计算机关机以后,再次自动启动系统。
- 备注:系统关机,再次自动启动系统,需要配合主板bios使用,主板bios需要支持定时启动,如下:
- 再/etc/rc.d/rc.local 中写入hwclock --set --date="2023-04-01 12:00:00"
- #每次开机自动执行此命令,更改bios时间,然后再bios里设置“12.10.00”,基本可以实现关机以后10分钟后重启(循环),某些测试条件下可以用到。
-
五、范例
-
环境介绍
- 计算机外接二块pcie测试板卡,每块板卡上面有4快硬盘,反复重启,观察是否存在“掉盘”得现象。
-
脚本思路
- 每次开机检查lspci信息(检查测试版卡是否存在)并保存信息日志(叠加保存)以及检查硬盘数量。
- 如果测试版卡不存在或是硬盘数量不对,那么计算机停止重启;否则计算机继续重启,重启次数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 转换一下。