带计数器的Bash for循环

带计数器的Bash for循环,bash,for-loop,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 configur

我遇到了一个问题,我正试图解决,我无法找到一个明确的谷歌搜索结果,我试图做什么。我在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

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

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

谢谢大家抽出时间


-Robert

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


这看起来也有点奇怪,你会这样做
awk'/a/'
紧跟在grep之后,当
grep-va
在语义上是相同的(不是吗?)

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


这看起来也有点奇怪,你会这样做
awk'/a/'
就在grep之后,当
grep-va
在语义上是相同的(不是吗?)

我所做更改的重点是:

  • 尝试列出没有grep和awk的有趣设备
  • 删除do done主体的括号,这将导致子shell
  • 使用n++将1添加到n中
  • 明确使用if语句,这样你的朋友就可以看到你在做什么
  • 删除了添加..时出现的
    echo$n$i
    失败时在代码中调用的
    echo”错误
  • (编辑:我把代码写得太短,举了一个不好的例子,忘记了双引号)
    在所有变量周围使用引号,以避免将来出现错误。有朝一日,您的变量将包含空格、通配符等,您可能希望自己已经接受过培训,尽可能使用双引号。引号可以很远(如在echo命令中),但足够近,以便不会解释变量的值
请继续使用此代码作为启动程序:

n=0
for i in /dev/sd[^a]*; do
   ((n++))
   if /sbin/pvs | grep -q "$i"; then
      echo "/dev/$i configured"
   else
      echo "$n $i"
   fi
done
echo "\$n after loop: $n"

我所做更改的重点是:

  • 尝试列出没有grep和awk的有趣设备
  • 删除do done主体的括号,这将导致子shell
  • 使用n++将1添加到n中
  • 明确使用if语句,这样你的朋友就可以看到你在做什么
  • 删除了添加..时出现的
    echo$n$i
    失败时在代码中调用的
    echo”错误
  • (编辑:我把代码写得太短,举了一个不好的例子,忘记了双引号)
    在所有变量周围使用引号,避免将来出现错误。有朝一日,您的var将包含空格、通配符等,您可能希望自己受过培训,能够尽可能使用双引号。引号可以很远(就像在echo命令中一样),但是足够近,这样就不会解释var的值
请继续使用此代码作为启动程序:

n=0
for i in /dev/sd[^a]*; do
   ((n++))
   if /sbin/pvs | grep -q "$i"; then
      echo "/dev/$i configured"
   else
      echo "$n $i"
   fi
done
echo "\$n after loop: $n"

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


谢谢你们两位抽出时间。当我被允许的时候,我会给你们两个投票。

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


谢谢你们两位抽出时间。当我被允许的时候,我会投票给你们两个。

在算术求值(
$(())
)中不需要使用变量扩展(
$I
),只需要使用变量名(
I
)。在算术求值(
$(())
)中不需要使用变量扩展(
$I
),只需使用变量名即可(
i
).Tx.我根据你的建议更改了代码。我以为我在某个地方读到了ksh,那一定是另一个问题。Tx.我根据你的建议更改了代码。我以为我在某个地方读到了ksh,那一定是另一个问题。