Como chamar funções do Matlab no bash com a entrada do usuário sendo operandos

1

Eu quero rodar o matlab usando o bash, que requer o comando como matlab -nodesktop -nosplash -r "functionmat(var1,var2)" para ser chamado. Por exemplo, posso executar matlab -nodesktop -nosplash -r "functionmat(5,4)" e, se esta for uma entrada válida, ela funciona e cria alguns arquivos e faz o que tiver o mfile .

Mas eu quero que as variáveis sejam entradas que o usuário é solicitado, portanto, isso varia cada execução sem que o usuário precise alterar o script. O usuário apenas insere entradas diferentes quando solicitado.

Isso não funciona (nada acontece):

#!/bin/bash
echo "Please variables 1 and 2:"
read var1 var2

matlab -nodesktop -nosplash -r "functionmat($var1,$var2)"

Chamar matlab assim também não funciona (diz que isso é um erro, pois provavelmente está lendo entradas do tipo string quando deveria haver números):

matlab -nodesktop -nosplash -r "functionmat('$var1','$var2')"

Isso também não funciona (nada acontece - nenhum arquivo criado):

sect1="\""
sect2="functionmat("
sect3=","
sect4=")"
sect5="\""

matlab -nodesktop -nosplash -r "$sect1$sect2$var1$sect3$var2$sect4$sect5"

Alguém não sabe como fazê-lo funcionar?

    
por HJY 24.10.2015 / 21:24

4 respostas

0

Ok, eu encontrei uma maneira de executar o programa

  #!/bin/bash

    echo "Please enter variables 1 and 2:"
    read var1 var2

    declare -i var1
    declare -i var2

    mystring="matlab -nodesktop -nosplash -r \"functionmat($var1,$var2);exit\""
    eval $mystring

Obrigado por toda sua ajuda se você respondeu

    
por 28.10.2015 / 16:25
3

Sua primeira sugestão deve funcionar corretamente. Eu suponho que a única variante é verificar se você está inserindo as variáveis corretamente (separadas por espaços, não separadas por vírgula). Você pode demonstrar que o código está correto modificando-o ligeiramente para imprimir os valores das duas variáveis e imprimir o comando matlab em vez de executá-lo:

#!/bin/bash
echo "Please variables 1 and 2:"
read var1 var2
echo "var1=$var1, var2=$var2."
echo matlab -nodesktop -nosplash -r "functionmat($var1,$var2)"
    
por 24.10.2015 / 23:47
1

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.

    
por 27.10.2015 / 18:05
0

As variáveis de bash são tratadas como cadeias de caracteres, se não forem digitadas. Eu começaria tentando declarar um tipo para suas variáveis. Algo assim,

declare -i var1

Não estou otimista de que essa declaração de tipo seja uma solução para você, mas vale a pena tentar.

Se isso não funcionar, por que não alterar os parâmetros de sua função para uma cadeia de caracteres em vez de valores numéricos? Deixe seu mfile tratar da conversão para o tipo numérico de sua escolha.

Referências:

por 24.10.2015 / 23:36