[英]Bash: Use variable in loop
你们上次出色地帮助了我之后,我再次需要一些帮助。 我正在编写一个脚本来使用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
作为下一个条目,并且*
将会扩展为运行脚本时所在目录中的文件名。 显然不是您想要的。
而是使用数组:
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
尝试这个:
#!/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
基于此处概述的数组变量: http ://wiki.bash-hackers.org/syntax/arrays?s[]= arrays
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.