2012-03-09 2 views
1

を、持っていRUN_TEST:シェル変数の名前は、私は次のスクリプトで働いている追加の文字

#!/bin/sh 

temp=$1; 
cat <<EOF | matlab 

[status name] = unix('echo $temp'); 
disp(name); 

% some Matlab code 

test_complete = 1; 
save(name) 

exit 
EOF 

私は、その後で.MATファイルを保存し、スクリプトに名前を渡すいくつかのコードを実行したいです渡された名前。しかし、好奇心が強い動作があります。

[energon2] ~ $ ./run_test 'run1' 
Warning: No display specified. You will not be able to display graphics on the screen. 

          < M A T L A B (R) > 
        Copyright 1984-2010 The MathWorks, Inc. 
       Version 7.12.0.635 (R2011a) 64-bit (glnxa64) 
           March 18, 2011 


    To get started, type one of these: helpwin, helpdesk, or demo. 
    For product information, visit www.mathworks.com. 

>> >> >> >> run1 

>> >> >> >> >> 
[energon2] ~ $ ls *.mat 
run1?.mat 

"?"ファイル名の最後に保存されますが、コマンドラインでは表示されません。これは私のニーズには受け入れられますが、なぜそれが起こっているのかわからないために少し刺激的です。どんな説明もありがたいです。

編集:解決策: Yukは根本的な原因とsave( '$ temp')の使用では以下のとおりです。私は今、次のスクリプトを使用しています

#!/bin/sh 

temp=$1; 
cat <<EOF | matlab 

% some Matlab code 

test_complete = 1; 
save('$temp') 

exit 
EOF 

ありがとうございました。

+0

getenv( 'temp')と同じ結果が得られますか? – macduff

+0

getenv( 'temp')は空の文字列を返します。 – Sevenless

答えて

3

お客様name変数には、最後の文字として行末が付きます。 UNIXでecho run1を実行すると、このコマンドはrun1と表示され、次に「入力してください」と表示されます。あなたのスクリプトでは、エコーのすべての出力はname variableに保存されます。

次でそれを確認することができます。

>> format compact 
>> [status, name] = unix('echo run1') 
status = 
    0 
name = 
run1 

>> numel(name) 
ans = 
    5 
>> int8(name(end)) 
ans = 
    10 
>> int8(sprintf('\n')) 
ans = 
    10 

どうやらこの文字は、UNIXのファイル名の一部にすることができますが、シェルは?として、それを表示します。

代わりにsave($temp)を行うことはできませんか?

編集訂正や詳細については下記のコメントを参照してください。

+0

save($ temp)はエラーをスローし、saveは文字列を受け取る必要があると主張します。 – Sevenless

+1

'save $ temp'や' save( '$ temp') 'はどうですか? – yuk

+0

どちらも機能します。私はMatlabがシェル変数に直接アクセスできることは知らなかった。ありがとうございました。 – Sevenless

関連する問題