我遇到了一个我正在努力解决的问题,而且我无法找到确定的谷歌搜索结果。我在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
答案 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)
我所做的更改的亮点是:
double
失败时代码中调用的echo "ERROR ADDING ..
。请继续使用此代码作为首发:
echo $n $i
答案 2 :(得分:0)
但是,我的问题是额外的括号,但Walter A的答案格式简单,我认为格式比我提交的代码更可靠。
感谢您的时间。当我被允许时,我会向你们两人投票。