Bash for counter with counter

时间:2015-10-31 21:16:45

标签: bash for-loop

我遇到了一个我正在努力解决的问题,而且我无法找到确定的谷歌搜索结果。我在bash中没有做过很多for循环,也许我有点滥用它。

我正在尝试解决一个问题,即我确定从一个简单的一个班轮返回的行并将计数器与它相关联。

一种班轮格式:

 n=0; for i in $( ls /dev/ | grep sd | awk '!/a/' ); do ( n=$(($n+1)); ( pvs | grep $i ) > /dev/null && echo /dev/$i configured || ( echo $n $i || ( echo "ERROR ADDING SECONDARY DRIVES ( /dev/$i )"; ) ) ); done; echo $n;

扩展格式:

n=0;
for i in $( ls /dev/ | grep sd | awk '!/a/' );
do (
   n=$(($n+1));
   ( pvs | grep $i ) > /dev/null && echo /dev/$i configured
      || (
         echo $n $i
         || (
            echo "ERROR ADDING SECONDARY DRIVES ( /dev/$i )";
            )
         )
   ); 
done; 
echo $n;

输出:

/dev/sdb configured
/dev/sdc configured
1 sdd
1 sde
1 sdf
1 sdg
0

期望的输出:

/dev/sdb configured
/dev/sdc configured
1 sdd
2 sde
3 sdf
4 sdg
4

我似乎遇到的问题是,在第二个和后续循环的开头,变量n被重置为其初始值0

这将极大地帮助我创建目录/data(1..n)以及创建独立的卷组和逻辑卷。

我只有/ dev / sdc / dev / sdb作为真正的硬盘驱动器,驱动器/ dev / sde ...是使用touch命令临时创建的。

谢谢大家的时间。

-Robert

3 个答案:

答案 0 :(得分:2)

你有一些额外不需要的括号,它们正在执行我相信的子shell,其中$ n的子shell值是本地的(不会被导出)。 (其他一些括号也是不需要的,分号在多行版本中也是多余的。)

n=0
for i in $( ls /dev/ | grep sd | awk '!/a/' )
do
   n=$(($n+1))
   ( pvs | grep $i ) > /dev/null && echo /dev/$i configured
      ||
         echo $n $i
         ||
            echo "ERROR ADDING SECONDARY DRIVES ( /dev/$i )"
done
echo $n

awk '!/a/'在语义上相同(不是吗?)时,你会在grep之后立即grep -v a看起来有点奇怪。

答案 1 :(得分:2)

我所做的更改的亮点是:

  • 尝试列出没有grep和awk的有趣设备;
  • 删除do-done正文的括号,这将导致子shell
  • 使用n ++添加1到n;
  • 明确使用if语句,以便您的朋友可以看到您在做什么;
  • 删除了double失败时代码中调用的echo "ERROR ADDING ..
  • (编辑:我的代码太短,给出了一个忘记双引号的坏例子)
    在所有变量周围使用引号,避免将来出现错误。有一天你的var将包含空格,通配符等等,你希望你曾经训练过尽可能使用双引号。引号可以很远(如在echo命令中),但足够接近,以便不会解释var的值。

请继续使用此代码作为首发:

echo $n $i

答案 2 :(得分:0)

但是,我的问题是额外的括号,但Walter A的答案格式简单,我认为格式比我提交的代码更可靠。

感谢您的时间。当我被允许时,我会向你们两人投票。