Então tentei fazer 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 entendi 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 contar sobre o "concluído" ausente. As pessoas perguntaram o que eu estava tentando fazer, bem, eu fiz outra pergunta para isso, já que esta foi respondida (a pergunta era: por que recebi um erro de sintaxe). Obrigado novamente.
Em sua função, há uma
do
correspondência, mas nãodone
para fechar a lista de comandos.Tente shellcheck para verificar seus scripts. Este é um relatório de bugs detectados e pontos suspeitos em seu script:
andcoz mostrou o que estava errado no seu código (falta
done
fechar o loop, para começar), mas acho que parece que você realmente quer um array.Não está claro o que você deseja que seu código faça, mas parece que é aproximadamente equivalente a copiar os argumentos da linha de comando para uma matriz:
Você pode então obter um elemento específico dessa matriz com
${a[i]}
ifi
é uma variável com um valor inteiro.É crucial colocar aspas duplas na expansão de
$@
, pois isso citaria os elementos individuais da$@
lista. Sem as aspas duplas, o shell dividiria os elementos em espaços em branco (o conteúdo deIFS
), e a geração de nome de arquivo ("globbing") seria realizada neles.Use
break
para sair de um loop em vez de definir a variável de loop para um valor após o final do loop.