簡體   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