2010-12-27 16 views
1

誰でも私がbashスクリプト関数から正しい値を返すのを助けることができますか? Bashスクリプト関数の戻り値の問題

はここに返す必要があります私の関数の最初の(そして唯一の)引数として渡されたファイルの行:

LOG_FILE_CREATION_TIME "logfile" 
timestamp=$? 
echo "Timestamp = $timestamp" 

:ここ

LOG_FILE_CREATION_TIME() 
{ 
    return_value=`awk 'NR==1' $1` 
    return return_value 
} 

そして、他のスクリプトでその関数の私の呼び出しです私は常にこのコードでいくつかのランダムな値を取得します。例えば、 "ログファイル" で62772031の値がある場合、私は出力として

タイムスタンプ= 255

を取得します。ファイル内のいくつかの他の値については、戻り値として他のランダムな値を返しますが、決して正しい値は返しません。

アイデア?

答えて

5

終了コードが0 - 255に制限されているが、あなたがタイムスタンプのためにそれを使用することはできません。

他に何も出力していないと思われるので、代わりにタイムスタンプをエコーし​​てください。これはうまくいくはずですか?

LOG_FILE_CREATION_TIME() 
{ 
    # If you want to do some more stuff, you might want 
    # to use the intermediate variable as you first did. 
    awk 'NR==1' $1 
} 

timestamp=$(LOG_FILE_CREATION_TIME "logfile") 
echo "Timestamp = $timestamp" 

あなたが望むすべては最初の行であれば、なぜ代わりにhead -1 logfileを使用していないので、あなたは、あなたの例では機能を簡素化しているのでしょうか?

+0

bashではなくshでこれをどうやって行うことができるか知っていますか? sh timestamp = $(LOG_FILE_CREATION_TIME "logfile") は機能しません。それは と言っています 'timestamp = $'予期しない – Eedoh

+0

@Eedohはバッククイックを使って試しています、 'timestamp = \' ... \ '' – plundra

7

シェルの機能はコマンドのように機能します。エラーレベルの値(整数)のみを返すことができます。文字列を取得するには、グローバル変数を設定するか、値を出力/エコーして、呼び出し元にコマンドの置換(バックティックなど)を使用させることができます。 Pythonで

#!/bin/bash 

LOG_FILE_CREATION_TIME() 
{ 
    return_value=`awk 'NR==1' $1` 
    echo $return_value 
} 

timestamp=$(LOG_FILE_CREATION_TIME $1) 

echo $timestamp 

無関係が、ところで::

これは動作します

#!/usr/bin/python2 

import sys 
print open(sys.argv[1]).readline() 

;-)

+0

、Pythonの '頭を-1'実行するには?私たちがすべての言語でそれを実装するならば*たくさんの答えがあります... – plundra

+0

@plundra私はこれよりもこのプログラムにもっと多くのことがあると仮定しています。確かに、ヘッド-1は1回限りのものに最適です。私は、OPがシェル内に関数を持つ大きなプログラムを書くのとは違う道を行くかもしれないと暗示していました。 – Keith

0

もう1つの方法は、グローバル変数を使用することです。このように複数の "return"変数を持つことができます。 実際には何も返されませんが、そのトリックを行います。

#!/bin/sh 
concat_ret 
concat() { 
for s in $* 
do 
concat_ret="$concat_ret $s" 
done 
return 0 
} 
echo "starting" 
concat String1 String2 String3 "and many other strings" 
echo $? 
echo $concat_ret 
exit 0 

出力本当に

starting 
0 
String1 String2 String3 and many other strings