上次你们帮了我大忙之后,我又需要帮助了。
我正在写一个脚本来用smartctl测试我的hdd。所以我当然可以复制每个磁盘的命令,但如果我只设置一次磁盘,然后脚本一个一个地执行这些命令,那就更棒了:

#!/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

关于linux - bash :循环使用变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41942194/

10-14 18:56
查看更多