Как вызывать функции Matlab в bash с операндами, вводимыми пользователем

[1131290] у вас есть несколько возможностей: [12172]/opt[1131885] означает опционально вы можете поместить их в определенную папку, но он не будет заполнять PATH по умолчанию, то создание символической ссылки в [1131886]/usr/bin[1131887] может позволить вам использовать их из [1131888]/opt[1131889]. [1131890]/opt[1131889]. Похоже, что эта опция не подходит, если Вы используете [1131906]. deb[1131907] файлы[12173] Вы также можете поместить их в [1131892]/usr/bin[1131893], ни о чем не беспокоясь, и не помещать их в определенную папку[12174]
1
27.10.2015, 17:06
4 ответа

Хорошо, я нашел способ запустить программу

  #!/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

Спасибо за вашу помощь, если вы ответили на

0
27.01.2020, 23:20

Ваш первый подход почти правильный, и все, что вам нужно, это убедиться, что переменные действительно соответствуют синтаксису Matlab. Второй неверен, потому что в Matlab входные данные выглядят как func ('1', '5') - строки в качестве аргументов. Третий ничего не делает, потому что строка «func (1,5)» - это просто строковый литерал. Замените matlab на printf '% s \ n' , чтобы увидеть, что вы ему передаете.

Проверка ввода

Использование declare -i var1 var2 приводит к тому, что переменные распознаются как целые числа , а при присваивании bash присваивает результат вычисления строки - to-assign как выражение в стиле C (и жалуется на синтаксические ошибки выражения). Таким образом:

  • Дает вам возможность использовать такие выражения, как 3 * 2 (оценивается в 6 оболочкой)
  • Не позволяет использовать десятичные дроби, такие как 2,45 .
  • Гарантирует, что переданное число является целым числом.
    • Структура, которая выглядит как [[: alpha:] _] [[: word:]] * будет распознано как имя переменной, которое будет дополнительно оцениваться и по умолчанию равно 0, если не определено.

Когда чтение вызывает ошибку, вся переменная все еще не инициализирована. Вы можете поймать это так:

declare -i var1 var2
until ((${#var1[@]} && ${#var2[@]})); do read -p "INPUT! NOW!" var1 var2; done

Custom Extended Globbing Patterns можно использовать, если вы хотите иметь дело с десятичными знаками (и исключить часть обработки переменных). Обратите внимание, что я слишком ленив, чтобы рассматривать выражения:

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

Вы даже можете пойти дальше, разрешив использовать некоторые переменные MATLAB, которые вы хотите использовать, поскольку таким образом они передаются в необработанных строках.

прочтите разделитель

Просто добавьте IFS + =, или что-нибудь еще, что должно быть допустимым разделителем, перед тем как читать .


Этот ответ является дополнением и, возможно, комбинацией этих двух ответов выше. Первоначально он был отредактирован 113859 и 113860 . Прочтите Руководство GNU Bash , главы 3.5.3 (инициализированная проверка), 3.5.7 (IFS), 3.5.8.1 (шаблон) и 4.2 (встроенная: declare) для получения дополнительной информации.

У меня на компьютере нет Matlab, поэтому я использовал GNU Octave для проверки правильности моих проверок синтаксиса. Есть также онлайн-сервисы Octave для всех, кто хочет попробовать синтаксис.

1
27.01.2020, 23:20

Ваше первое предложение должно работать правильно. Я полагаю, единственный вариант - проверить, правильно ли вы вводите переменные (через пробел, а не через запятую). Вы можете продемонстрировать правильность кода, слегка изменив его, чтобы напечатать значения двух переменных и напечатать команду matlab вместо ее выполнения:

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

Переменные Bash обрабатываются как символьные строки, если не введены. Я бы начал с попытки объявить тип для ваших переменных. Что-то вроде этого,

declare -i var1

Я не оптимистичен, что это объявление типа будет для вас решением, но его стоит попробовать.

Если это не сработает, почему бы не изменить параметры вашей функции на символьную строку вместо числовых значений? Позвольте вашему mfile обработать преобразование в числовой тип по вашему выбору.

Литература:

0
27.01.2020, 23:20

Теги

Похожие вопросы