목록을 사용하려고 하면 bash 스크립트가 실패합니다.

목록을 사용하려고 하면 bash 스크립트가 실패합니다.

IP 주소를 확인하기 위해 여기에서 bash 스크립트를 찾았습니다. http://www.linuxjournal.com/content/validating-ip-address-bash-script

실행하려고 하면 오류가 발생합니다.

 test.sh: line 22: syntax error: unexpected "(" (expecting "fi")

22번째 줄은 다음과 같습니다.

  ip=($ip)

질문

  1. 이 줄은 목록이나 배열을 만들어야 합니까?
  2. 나는 두 가지 다른 쉘을 시도했지만 둘 다 작동하지 않습니다. 시험을 마친:

    #!/bin/bash

그리고

 #!/bin/sh

어떤 제안이라도 대단히 감사하겠습니다.

답변1

저것:

test.sh: line 22: syntax error: unexpected "(" (expecting "fi")

bash보고된 오류 메시지 가 아닙니다 . Almquist 쉘 및 그 파생물(예: dashbusybox)은 sh다음을 보고합니다.

$ grep -z '(expecting' /bin/dash
%s unexpected (expecting %s)

ash쉘이 배열을 지원하지 않는다는 사실을 기반으로 이 스크립트는 she-bang에 표시된 bash대로 작동합니다(3.2 이상). 비록 4차 IPv4 주소를 확인하는 것처럼 , 및 구문을 혼합한 #!/bin/bash것처럼 보이지만 . , 그 중 일부는 소수점 3자리로 제한됩니다(예: 에서는 약간의 오류가 발생합니다).bashzshksh93bash008.008.008.008

및 둘 다에서 인식되는 표준 POSIX 구문을 사용하면 sh다음을 수행할 수 있습니다.dashbash

valid_ip() (
  IFS=.
  set -o noglob
  set -- $1''
  [ "$#" -eq 4 ] || exit
  for i do
    case $i in
      ("" | *[!0-9]*) exit 1;;
    esac
    [ "$i" -le 255 ] || exit
  done
)

답변2

이것은 작동합니다:

#!/bin/bash

ip=127.0.0.1

ip=($ip)

printf 'The first IP number is "%s"\n' "${ip[0]}"

에서 이 명령을 실행하면 bash스크립트에 다른 명령문 관련 오류가 있습니다 if. /bin/sh아래에서 실행하면~해야 한다sh배열을 이해하지 못하여 실패합니다.

ShellCheck를 통해 스크립트를 실행하는 것이 좋습니다.https://www.shellcheck.net/

답변3

1) 이 줄은 목록이나 배열을 만들어야 합니까?

배열을 만드는 중입니다. 먼저 IFS를 로 설정한 .다음 ip=($ip)를 표시합니다. 따라서 ip=10.11.12.13배열이 ip=([0]=10 [1]=11 [2]=12 [3]=13) 그렇다면 각 옥텟이 256보다 작은지 확인하는 작업이 진행됩니다.

2) 이를 위해 어떤 쉘을 사용해야합니까?

이 스크립트는 확실히 bash용으로 생성되었으므로 bash에서 실행해야 합니다.

삼) 내 문제가 뭐야?

문제는 어떤 방식으로든 스크립트를 수정하여 구문 오류가 발생했다는 것입니다. 실행 중인 전체 스크립트를 정확하게 게시해 주시면 저희가 알아낼 수 있도록 노력하겠습니다. 그리고 댓글에서 말했듯이 스크립트 이름을 valid_ip.sh. 그렇게 하지 않으면 오류가 발생하지 않지만 스크립트가 작동하지 않게 됩니다.

관련 정보