Erro de sintaxe ao chamar uma função

2

Então, tentei criar uma função em um script que cria uma nova variável para cada argumento ao executar o script. Este é o meu código:

#!/bin/bash

# Creating function log
#ARG1=${1}

log() {
  echo "You called DA LOG FUNCTION!!!1!!11one111!"
}

log

#echo "${1}"
#echo "$ARG1"

fcta() {
  for ((x=0;x<1000;++x)); do
   "a$x"=${1}
   if [[ ${#} -gt 1 ]]; then
     shift
   else
     x=1001
   fi
  echo "${a$x}"
#  echo "${1}"
}

fcta $@

Eu entendo isso:

vagrant@localhost vagrant]$./luser-demo10.sh 12 12 12
You called DA LOG FUNCTION!!!1!!11one111!
./luser-demo10.sh: line 25: syntax error near unexpected token '}'
./luser-demo10.sh: line 25: '}'
[04:11----------------------------------------
vagrant@localhost vagrant]$

Então esta é a linha 25

#  echo "${1}"
} <----- LINE 25

fcta $@

EDIT: Obrigado por me dizer sobre a falta "feito". As pessoas perguntaram o que eu estava tentando fazer, bem, eu perguntei a outra pergunta para isso, uma vez que esta foi respondida (a questão era, por que eu recebi um erro de sintaxe). Obrigado novamente.

    
por iamAguest 22.08.2018 / 10:21

2 respostas

4

Na sua função existe um do , mas nenhum done correspondente para fechar a lista de comandos.

Teste o shellcheck para verificar seus scripts. Este é um relatório de bugs detectados e pontos suspeitos no seu script:

Line 16:
  for ((x=0;x<1000;++x)); do
  ^-- SC1009: The mentioned syntax error was in this for loop.
      ^-- SC1073: Couldn't parse this arithmetic for condition. Fix to allow more checks.
                          ^-- SC1061: Couldn't find 'done' for this 'do'.

Line 25:
}
^-- SC1062: Expected 'done' matching previously mentioned 'do'.
 ^-- SC1072: Unexpected keyword/token. Fix any mentioned problems and try again.
    
por 22.08.2018 / 10:47
3

andcoz mostrou o que estava errado no seu código (faltando done para fechar o loop, para começar ), mas parece que você realmente quer um array.

Não está claro o que você quer que seu código faça, mas parece que é aproximadamente equivalente a copiar os argumentos da linha de comando para um array:

a=( "$@" )

Você pode então obter um elemento específico desse array com ${a[i]} if i é uma variável com um valor inteiro.

É importante citar duas vezes a expansão de $@ , pois isso seria citar os elementos individuais da lista $@ . Sem as aspas duplas, os elementos seriam divididos em espaços em branco (o conteúdo de IFS ) e a geração de nome de arquivo ("globbing") seria executada neles.

Outro comentário sobre o seu código: Use break para sair de um loop em vez de definir a variável de loop como um valor após o final do loop.

    
por 22.08.2018 / 11:06

Tags