在 bash 中的两个“while”循环内使用“if”——“if”已完成并跳过

在 bash 中的两个“while”循环内使用“if”——“if”已完成并跳过

我已经查找过“在 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

相关内容