我已经查找过“在 while 循环 bash 中使用 if”,但还没有找到我的情况。
我有一个文本文件,其中包含设备列表。文本文件中的每一行都是一个没有空格的短字符串。这是文本文件:
sda
sda1
sda2
sda3
sdb
我编写了一个脚本,逐行读取文本文件(第一个“while”循环)。对于每一行,使用“dev/$line”作为输入调用“df”。“df”将 2 行输出到 stdout。使用管道,逐行读取 df 的输出(第二个“while”循环)。我知道嵌套的“while”循环和从“df”到“while read”的管道工作正常,因为我可以使用“echo”将“df”中的每一行打印到控制台。
我的问题是,我添加了“if”条件进行测试,但“if”似乎被跳过了!脚本的这一部分没有任何输出……即使如果“if”条件失败,它应该会回显“未找到”。
脚本如下:
#!/usr/bin/bash
#list the devices in /dev, save list of devices beginning in sd
ls /dev | grep -E 'sd' > /home/testuser/grepout.txt
#iterate through the list and check its mountpoint
input=/home/testuser/grepout.txt
bootdev=''
echo "$bootdev is not set"
#if the mountpoint is boot, then save the dev name
while read line
do
echo "checking mountpoint of $line"
counter=0
df /dev/"$line" --output=target | while read line2
do
echo $counter
((counter++))
if [ "$line2"="/boot" ]
then
echo "$line2"
bootdev="$line"
else
echo "Not found"
fi
done
done < "$input"
输出如下:
is not set
checking mountpoint of sda
0
Mounted on
1
/dev
checking mountpoint of sda1
0
Mounted on
1
/dev
checking mountpoint of sda2
0
Mounted on
1
/boot
checking mountpoint of sda3
0
Mounted on
1
/dev
checking mountpoint of sdb
0
Mounted on
1
/dev
答案1
我不确定具体目标是了解嵌套循环运算符的行为,还是找到启动卷,但在你的情况下,我过去已经解决了这个问题,避免了嵌套的 while 循环,因为我发现它们难以阅读和维护:
#!/bin/bash
for disk in `find /dev/ -maxdepth 1 -name \*sd\*`; do
if df $disk | grep '/boot'; then
echo "$disk is bootvolume!"
fi
done