ユーザー入力をオペランドとしてbashからMatlab関数を呼び出す方法

ユーザー入力をオペランドとしてbashからMatlab関数を呼び出す方法

matlab -nodesktop -nosplash -r "functionmat(var1,var2)"コマンドを呼び出す必要があるbashを使用してmatlabを実行したいと思います。たとえば、を実行できます。matlab -nodesktop -nosplash -r "functionmat(5,4)" これが有効な入力であれば動作します。いくつかのファイルを作成mfileこれらの操作のいずれかを実行します。

ただし、変数がユーザーが要求する入力になりたいので、ユーザーがスクリプトを変更することなく実行されるたびに異なります。ユーザーは要求を受け取ると、単に別の入力を入力します。

これは機能しません(何も起こりません):

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

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

このような呼び出しmatlabも機能しません(数字が必要ですが、文字列型の入力を読み取っているのでバグと言います)。

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

この方法は機能しません(何も起こりません。ファイルは生成されません)。

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

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

誰もが動作する方法を知っていますか?

答え1

最初の提案は正しく機能します。唯一のバリエーションは、変数を正しく入力したことを確認することです(カンマではなく空白で区切られます)。コードを少し変更して両方の変数の値を印刷し、コマンドを実行する代わりにコマンドを印刷すると、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)"

答え2

最初のアプローチはほぼ正確です。変数が実際に正当なMatlab構文であることを確認するだけです。 2つ目は、Matlabの入力がパラメータfunc('1','5')として文字列のように見えるため、間違っています。 3行目は"func(1,5)"文字列リテラルなので、何もしません。何を伝えているかを見るにmatlabはに置き換えてください。printf '%s\n'

入力検証

使用declare -i var1 var2変数が次のように認識されるようにします。整数そして、割り当てられると、bashは評価結果をstring-to-assignCスタイルの式として指定します(そして式の構文エラーについて文句を言います)。これを行う:

  • 3*2(シェルで評価されている)などの6式を使用できます。
  • のようなものを使用することは許可されていません2.45
  • 渡された数字が整数であることを確認してください。
    • 次の構造体は[[:alpha:]_][[:word:]]*varnameとして認識され、さらに評価され、定義されていない場合、デフォルトは0です。

エラーが発生した場合、read変数全体はまだ初期化されません。次のようにキャプチャできます。

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

カスタム拡張ワイルドカードモード処理したい場合は使用できます小数点はい。 (変数処理部分は除外されます。) 表現について考えるにはあまりにも怠惰であることに注意してください。

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変数を受け入れることもできます。これは生の文字列として渡されるからです。

read仕切り

IFS+=,有効な区切り文字として使用したい項目またはそれ以前に追加するだけですread


この回答は上記の2つの回答に追加されるか、おそらく組み合わせられています。編集されたことが判明しました113859そして113860。読むGNU バッシュマニュアル詳細については、3.5.3章(初期化検査)、3.5.7章(IFS)、3.5.8.1章(モード)、および4.2章(組み込み:宣言)を参照してください。

私のコンピュータにMatlabがないので、GNU Octaveを使って構文チェックの効率を確認してください。構文を試したい人のためのオンラインOctaveサービスもあります。

答え3

入力しないと、Bash変数は文字列として扱われます。まず、変数型を宣言してみましょう。これらのこと、

declare -i var1

このタイプの宣言が解決策を提供すると楽観的ではありませんが、試してみる価値があります。

それでも機能しない場合は、関数の引数を数値の代わりに文字列に変更するのはどうでしょうか? mfileが選択した数値型への変換を処理するようにします。

引用:

答え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

答えてくれたら助けてくれてありがとう。

関連情報