Передача аргументов функции octave из скрипта bash

Я написал функцию в Octave, которая принимает строку, прочитанную из файла (по одной строке за раз) в качестве входного аргумента. Я использую сценарий bash для чтения строки за раз из файла, а затем передаю это в качестве аргумента функции октавы из сценария.

Мой bash-скрипт выглядит так:

#!/bin/bash  

while read line
do
  octave --silent --eval 'myOctaveFunc("${line}")'
done < "inFileName"

Когда я выполняю приведенный выше скрипт, октава выдает такие ошибки, как:

error: called from:
error:   /usr/share/octave/3.2.3/m/miscellaneous/fullfile.m at line 43, column 11
error: evaluating argument list element number 2
error: evaluating argument list element number 1
error:   /usr/libexec/octave/packages/gsl-1.0.8/i386-redhat-linux-gnu-api-v37/PKG_ADD at line 47, column 1
error: addpath: expecting all args to be character strings
error: addpath: expecting all args to be character strings
error: addpath: expecting all args to be character strings
error: addpath: expecting all args to be character strings

и так далее..

Мне удалось запустить сценарий октавы myOctaveFunc.m с входными аргументами, такими как helloWorld, из командной строки. Проблема возникает, когда я пытаюсь запустить его из сценария bash.

Мои вопросы:
1. Как мне запустить функцию octave из сценария bash?
2. Я использую gvim для редактирования сценария bash. Когда я набираю строку для вызова сценария октавы, я вижу, что ${line} окрашена иначе, чем в обычных обстоятельствах. Это из-за '', используемого для вызова функции октавы? Если да, то стоит ли мне об этом беспокоиться?


person Sriram    schedule 27.07.2011    source источник
comment
Как вы вызываете свой сценарий октавы вне сценария bash? Что вы увидите, если вставите в сценарий bash echo octave --silent ... вместо octave --silent ?   -  person Bruno De Fraine    schedule 27.07.2011
comment
@Bruno: вызов сценария октавы (после эха) выглядит примерно так: octave --silent --eval 'myOctaveFunc(helloWorld)', тогда как должно быть octave ... 'myOctaveFunc("helloWorld")'. Я пробовал octave ... 'myOctaveFunc(\"helloWorld\")'. Это отлично работает в bash с echo, но не работает при вызове сценария октавы.   -  person Sriram    schedule 27.07.2011


Ответы (1)


Одинарные кавычки не позволяют оболочке заменить переменную:

octave --silent --eval "myOctaveFunc(\"$line\")"

Если octave позволяет вам использовать одинарные кавычки для цитирования строк, это будет выглядеть немного чище (внутри двойных кавычек одинарные кавычки не имеют особого значения):

octave --silent --eval "myOctaveFunc('$line')"

Кроме того, из vim убедитесь, что вы сохранили файл в формате unix, чтобы каждая строка не заканчивалась символом возврата каретки: :set ff=unix

person glenn jackman    schedule 27.07.2011
comment
Кроме того, нужна ли опция :set ff=unix? Я работаю на Linux-машине и стараюсь делать dos2unix каждый раз, когда возвращаюсь из Windows. - person Sriram; 27.07.2011
comment
Вы ничего не сказали нам о своем окружении, так что нет, не нужно. - person glenn jackman; 27.07.2011
comment
Он возвращает мне warning: function 'dbEval' defined within script file '/home/max/octave-dollar/scripts/dbEval.m', когда я запускаю octave --silent --eval "dbEval(\"hello-world\")" - person pwan; 20.03.2017