在你们上次帮助我之后,我(再次)需要一些帮助。 我正在编写一个脚本来使用 SmartCTL 测试我的硬盘。所以我当然可以复制每个磁盘的命令,但如果我可以只设置一次磁盘并且脚本一个一个地执行它们,那就更棒了:
#!/bin/bash
date=`date +%d-%m-%Y-%T`
touch /var/log/disk/Disk-health-check-$date
disks="/dev/sda
/dev/sdb"
for disk in disks
do
wait=$(smartctl -t short $disk | awk '/Please wait/ {print $3}')
echo "waiting..."
sleep $((wait * 60 + 60))
echo "done"
smartctl --log=selftest $disk
smartctl -a $disk
done
exit
但不幸的是它只使用/dev/sda,而不是sdb,等等。 那么我怎样才能使它起作用呢?提前谢谢大家!!
最佳答案
试试这个:
for disk in disks; do
echo "$disk"
done
您会看到它唯一回显的是 disks
。那是因为您告诉它只迭代一个值,而该值是 disks
。
要执行您尝试执行的微妙错误操作,您需要:
for disk in $disks; do
echo "$disk"
done
但是,正如我所说,那是错误。假设您的 disks
变量分配方式略有不同:
disks='
/dev/disks/by-label/My Drive
/dev/disks/by-label/Other Drive
/dev/disks/by-label/* TEENAGE DAUGHTER'S DRIVE *
'
这会将 /dev/disks/by-label/My
作为一个条目,将 Drive
作为下一个 - 而 *
s 将扩展为您运行脚本时所在目录中的文件名。显然不是你想要的。
相反,使用数组:
disks=(
"/dev/disks/by-label/My Drive"
"/dev/disks/by-label/Other Drive"
"/dev/disks/by-label/* TEENAGE DAUGHTER'S DRIVE *"
)
...并将它们迭代为:
for disk in "${disks[@]}"; do
echo "Processing: $disk"
done
关于linux - Bash:在循环中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41942194/