繁体   English   中英

重击:循环使用变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM