"if...else" 조건이 있는 "for" 루프에 오류가 발생했습니다.

"if...else" 조건이 있는 "for" 루프에 오류가 발생했습니다.

안녕하세요 여러분, 저는 bash 스크립트 작성이 처음입니다.

나는 해야 할 일이 있다. 노드 이름과 IP 주소가 업데이트된 파일이 있고 원하는 디렉터리에 없는 노드에 대한 모든 파일과 업데이트된 파일에 있는 노드에 대한 모든 파일을 만들고 이름을 편집해야 합니다.

마지막 줄에서 위쪽으로 입력을 아래에서 위로 제공해야 하며 내 스크립트는 필요에 따라 아래에서 위로 실행되어 원하는 디렉토리에 누락된 항목을 의미합니다.

나는 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 '

내 스크립트에 대한 설명:

  1. 첫 번째 줄은 디렉터리에 파일이 몇 개 있는지 입력하는 것입니다.

  2. 이 줄은 파일에서 입력을 받습니다. 파일에는 몇 줄이 있습니까?

  3. 숫자를 빼면 그 값은 정수가 됩니다.

  4. 다음 줄에 사용할 변수 값을 선언합니다.

  5. 이 줄은 파일에서 입력을 받아 노드 이름이 포함된 세 번째 열을 잘라냅니다.

  6. 도 변수다

  7. IP 주소를 파일 입력으로 사용

  8. 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;

관련 정보