我的一个 bash shell 脚本出了问题。我问过几个同事,但他们都摇头(挠头之后),所以我来这里寻求答案。
根据我的理解,每次运行循环后它都必须创建新文件,如果我的
莱特 和 莱特2
变量在增加,或者我的脚本中存在一些位置问题,但我的两个变量在执行每一行后都没有获得新值,而是取旧值并使文件具有相同的名称。为什么会发生这种情况?我该如何防止这种情况发生?
这是我的脚本
#!/bin/bash
set -x
osdir=$(find /nodeFolder -maxdepth 1 -type f | wc -l)
lbdir=$(more /root/nodeFile.txt |wc -l)
lait2=1
l2=$(awk '{print $3}' < /root/nodeFile.txt | tail -$lait2 |head -1)
count=$(($lbdir-$osdir))
lait=1
newip=$(awk '{print $1}' < /root/nodeFile.txt | tail -$lait |head -1)
if [ $osdir -eq $lbdir ] ; then
echo " Nothing to do "
else if [ $osdir -lt $lbdir ] ; then
for ((i=0; i<count; i++)); do
cd /nodeFolder
cp node-p-2.cfg $l2.cfg
sed -i 's/192.168.0.2/'$newip'/' $l2.cfg
sed -i 's/node-p-2/'$l2'/' $l2.cfg
echo " Node is added successfull"
lait=$((lait + 1))
lait2=$((lait2 + 1))
done
fi
fi
我的目标是在执行这些行时获得新价值
cp node-p-2.cfg $l2.cfg
sed -i 's/192.168.0.2/'$newip'/' $l2.cfg
sed -i 's/node-p-2/'$l2'/' $l2.cfg
我必须创建节点文件及其放置在 /root/nodeFile.txt 中的 ip,我必须将其与已经放置一些文件的目录 /nodeFolder 进行比较。如果目录中放置的文件数不等于 /root/nodeFile.txt 的行数,则必须从底部读取 /root/nodeFile.txt 并获取节点名称和 ip 的输入,然后创建一个文件并根据示例文件 node-p-2.cfg 进行更改,我的脚本正在运行但在执行循环后没有更新两个变量 lait 和 lait2。因为我必须从底部输入它,然后是倒数第二行,然后是倒数第三行,然后是第四行等等。
答案1
如果您想在每次迭代时更新这些值,则需要在 for 块内设置l1
和。newip
#!/bin/bash
set -x
osdir=$(find /nodeFolder -maxdepth 1 -type f | wc -l)
lbdir=$(more /root/nodeFile.txt |wc -l)
lait2=1
count=$(($lbdir-$osdir))
lait=1
if [ $osdir -eq $lbdir ] ; then
echo " Nothing to do "
else if [ $osdir -lt $lbdir ] ; then
for ((i=0; i<count; i++)); do
cd /nodeFolder
l2=$(awk '{print $3}' < /root/nodeFile.txt | tail -$lait2 |head -1)
newip=$(awk '{print $1}' < /root/nodeFile.txt | tail -$lait |head -1)
cp node-p-2.cfg $l2.cfg
sed -i 's/192.168.0.2/'$newip'/' $l2.cfg
sed -i 's/node-p-2/'$l2'/' $l2.cfg
echo " Node is added successfull"
lait=$((lait + 1))
lait2=$((lait2 + 1))
done
fi
fi
PS:代码可读性不强,格式不正确,变量名含糊不清...这些对于发现错误没有帮助;)