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