Sua primeira abordagem está quase certa, e tudo que você precisa é garantir que as variáveis sejam realmente uma sintaxe legal do Matlab. O segundo está errado porque no Matlab a entrada se parece com func('1','5')
- strings como argumentos. O terceiro não faz nada porque a linha "func(1,5)"
é apenas uma string literal. Substitua matlab
por printf '%s\n'
para ver o que você está passando para ele.
Verificação de entrada
O uso de declare -i var1 var2
faz com que as variáveis sejam reconhecidas como inteiros e na atribuição bash atribui o resultado da avaliação da expressão string-to-assign
como estilo C ( e reclama de erros de sintaxe de expressão). Então, fazendo isso:
- Permite que você use expressões como
3*2
(avaliado para 6
por shell)
- Não permite que você use decimais como
2.45
.
- Garante que o número passado seja um inteiro.
- Uma estrutura que se parece com
[[:alpha:]_][[:word:]]*
será reconhecida como um nome de variável, que será avaliado posteriormente e será padronizado como 0 se não for definido.
Quando um erro é lançado por read
, toda a variável ainda não foi inicializada. Você pode pegar assim:
declare -i var1 var2
until ((${#var1[@]} && ${#var2[@]})); do read -p "INPUT! NOW!" var1 var2; done
Padrões Globbing Estendidos Personalizados podem ser usados se você quiser lidar com decimais (e excluir a parte de processamento variável). Note que estou com preguiça de considerar expressões:
shopt -s extglob # bash 3, regex =~ is bash 4.
until [[ $var1 == +([0-9])?(.*([0-9])) && $var2 == +([0-9])?(.*([0-9])) ]]; do
read -p "Please input.. " var1 var2
done
Você pode até mesmo ir mais longe, permitindo algumas variáveis do MATLAB que você deseja usar, já que desta forma ele é passado em strings brutas.
read
separador
Basta adicionar IFS+=,
ou qualquer outra coisa que você queira que seja um separador válido antes de read
.
Esta resposta é complementar e possivelmente uma combinação dessas duas respostas acima. Originalmente, ele foi editado 113859 e 113860 . Leia o Manual do GNU Bash capítulos 3.5.3 (verificação inicializada), 3.5.7 (IFS) , 3.5.8.1 (padrão) e 4.2 (builtin: declare) para mais informações.
Eu não tenho o Matlab no meu computador, então usei o GNU Octave para verificar a validade das minhas verificações de sintaxe. Há também serviços on-line do Octave para qualquer um que queira experimentar a sintaxe.