大家好,我是编写 bash 脚本的新手。
我有任务要做。我有一个文件,其中节点名称和 IP 地址已更新,我必须制作不在我们所需目录中的节点的每个文件,以及位于更新文件中的节点的每个文件,并编辑它们的名称。
我必须从下到上给出输入意味着从最后一行到向上,我的脚本将根据我的需要从下到上运行意味着我所需目录中缺少的那些条目。
我使用 if else 条件,并且必须放置 for 循环来完成我的任务,直到它等于。我的脚本是
!/bin/bash
set -x
giosdir=$(find /usr/local/example-dir -maxdepth 1 -type f | wc -l)
lbdir=$(more /root/scripts/servers/new/example.txt |wc -l)
count=$(($lbdir-$giosdir))
lait2=1
l2=$(awk '{print $3}' < /root/scripts/servers/new/example.txt | tail -$lait2)
lait=1
newip=$(awk '{print $1}' < /root/scripts/servers/new/example.txt | tail -$lait)
if [ $nagiosdir -eq $lbdir ] ; then
echo " Nothing to do "
else
if [ $giosdir -lt $lbdir ] ; then
for((i=0;i<count;i++));do
{
cd /usr/local/
cp example-Node-2.txt $l2.txt
sed -i 's/10.10.0.1/'$newip'/' $l2.txt
sed -i 's/examole-Node-2.txt/'$l2'/' $l2.txt
echo " Node is added successfull"
lait2++;
lait++;
}
fi
fi
但我收到这个错误
第 43 行:意外标记 fi' 附近的语法错误第 43 行:fi '
我的脚本的描述:
第一行是从目录中获取有多少个文件的输入。
该行从文件中获取输入,该文件有多少行
减去数字,该值将是一个整数
声明在下一行中使用的变量值
此行从文件中获取输入并剪切保存节点名称的第三列
也是一个变量
将 IP 地址作为文件的输入
if
状况
关于循环的语法有什么想法for
吗?
答案1
在所有其他事情中,您没有在和done
之间终止 for 循环。在这种情况下,您不需要使用大括号。}
fi
bash 中的运算符++
需要算术扩展,因此您需要使用((lait++))
.
会$nagiosdir -eq $lbdir
比较整数,因此使用字符串会产生错误:
$ test hi -eq hi
-bash: test: hi: integer expression
你会想用它$nagiosdir = $lbdir
来代替。
还有其他事情,但这些将是脚本中的语法错误。
答案2
for
通过终止循环done
。 (您可以删除 for 循环中的那些大括号。)
答案3
我不知道你的脚本,但我调试你的脚本:
#!/bin/bash
set -x
giosdir=$(find /usr/local/example-dir -maxdepth 1 -type f | wc -l)
lbdir=$(more /root/scripts/servers/new/example.txt |wc -l)
count=$(($lbdir-$giosdir))
lait2=1
l2=$(awk '{print $3}' < /root/scripts/servers/new/example.txt | tail -$lait2)
lait=1
newip=$(awk '{print $1}' < /root/scripts/servers/new/example.txt | tail -$lait)
if [ "$nagiosdir" = "$lbdir" ] ; then
echo " Nothing to do "
else
if [ "$giosdir" <= "$lbdir" ] ; then
for((i=0;i<count;i++));do
cd /usr/local/
cp example-Node-2.txt $l2.txt
sed -i 's/10.10.0.1/'$newip'/' $l2.txt
sed -i 's/examole-Node-2.txt/'$l2'/' $l2.txt
echo " Node is added successfull"
lait2++;
lait++;
done;
fi;
fi;