bash scripts falham ao tentar usar lista

0

Eu encontrei um script bash para validar endereços IP aqui: link

Quando tento executá-lo, recebo o erro:

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

A linha 22 é assim:

  ip=($ip)

Pergunta

  1. Esta linha deveria estar criando uma lista ou matriz?
  2. Eu tentei dois shells diferentes e nem trabalho. tentou:

    #! / bin / bash

e também

 #!/bin/sh

Qualquer sugestão seria apreciada.

    
por dot 13.09.2017 / 20:18

3 respostas

3

Isso:

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

não é uma mensagem de erro que bash reporta. É um que o shell Almquist e seus derivados como dash ou busybox sh reportam:

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

As conchas baseadas em ash não suportam matrizes, esse script é destinado a bash (3.2 ou superior), como indica o #!/bin/bash she-bang, embora pareça mais uma mistura entre bash , zsh e ksh93 sintaxe se for para verificar se há endereços IPv4 com quatro casas decimais em que as partes estão limitadas a 3 dígitos decimais (em bash , isso daria alguns erros sobre 008.008.008.008 , por exemplo).

Com a sintaxe% POSI sh padrão, que dash e bash reconhecem, você pode fazer em vez disso:

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
)
    
por 13.09.2017 / 22:20
1

Isso funciona:

#!/bin/bash

ip=127.0.0.1

ip=($ip)

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

Se você estiver executando isso em bash , terá algo errado em seu script relacionado a uma instrução if . Se você está executando isso em /bin/sh , então deve falhar, pois sh não sabe sobre matrizes.

Sugiro que você execute seu script por meio do ShellCheck, no link

    
por 13.09.2017 / 20:26
1

1) Esta linha deveria estar criando uma lista ou array?

Está criando uma matriz. Primeiro, define o IFS como . e, em seguida, diz ip = ($ ip). Então, se sua ip=10.11.12.13 de sua matriz for ip=([0]=10 [1]=11 [2]=12 [3]=13) Em seguida, verifica se cada octeto é menor que 256.

2) Qual shell deve ser usado

Este script é feito definitivamente para o bash e, portanto, deve ser executado no bash.

3) Qual é o meu problema

O problema é que você modificou o script de alguma forma que causou um erro de sintaxe. Por favor, poste o script completo exatamente como você está rodando e nós podemos tentar descobrir. Além disso, como eu disse no meu comentário, você deve nomear este script valid_ip.sh . Não fazer isso não deve causar o erro, mas também fará com que o script não funcione.

    
por 13.09.2017 / 21:08