Bash:在循环中使用变量

时间:2017-01-30 17:45:16

标签: linux bash shell disk

在你们上次精彩地帮助我之后,我需要一些帮助(再次)。 我正在编写一个脚本,用SmartCTL测试我的硬盘。所以我可以当然复制每个磁盘的命令,但是如果我可以设置磁盘一次并且脚本逐个执行它会更加真棒:

*Main> seqTree [0..] input
Node [Leaf 0,Leaf 1,Node [Leaf 2,Leaf 3]]

但不幸的是它只使用/ dev / sda,而不是sdb等。 那我怎么能让这个有用呢?先谢谢你们!!

2 个答案:

答案 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