带计数器的Bash for循环
我遇到了一个问题,我正试图解决,我无法找到一个明确的谷歌搜索结果,我试图做什么。我在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
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,那一定是另一个问题。