在你们上次精彩地帮助我之后,我需要一些帮助(再次)。 我正在编写一个脚本,用SmartCTL测试我的硬盘。所以我可以当然复制每个磁盘的命令,但是如果我可以设置磁盘一次并且脚本逐个执行它会更加真棒:
*Main> seqTree [0..] input
Node [Leaf 0,Leaf 1,Node [Leaf 2,Leaf 3]]
但不幸的是它只使用/ dev / sda,而不是sdb等。 那我怎么能让这个有用呢?先谢谢你们!!
答案 0 :(得分:4)
试试这个:
for disk in disks; do
echo "$disk"
done
你会发现回声的唯一内容是disks
。这是因为您要告诉它只迭代一个值,该值为disks
。
要做你想要做的巧妙错误的事情,你需要:
for disk in $disks; do
echo "$disk"
done
但是,正如我所说的那样, buggy 。让我们说你的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
答案 1 :(得分:1)
试试这个:
#!/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