linux - Bash:在循环中使用变量

标签 linux bash shell disk

在你们上次帮助我之后,我(再次)需要一些帮助。 我正在编写一个脚本来使用 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/

相关文章:

linux - 以字节为单位获取远程文件的大小? (没有内容大小)

shell - shell脚本中大括号{}和中括号()的区别

linux - SQLite:Fsyncing with journal_mode = wal and synchronous = normal

Bash Ubuntu for Windows,使用来自 Git Bash 的配色方案

bash - 用于查找数据文件中最大和最小数字的脚本

android - 在ANT中执行 `android update project`失败,找不到sdkmanager.jar

shell - 在 Fish shell 提示符中测试 RETVAL?

linux - 如何在 bash for 循环中跳过带有注释(# 空格)的行

linux - 如何在桌面上创建一个以其他用户身份自动执行的快捷方式?

c++ - 在 C++ 中计算毫秒的可移植方法?