2013-03-27 5 views
17

を使用している場合に関数を呼び出す場合は、その後、私はこの作品がする文と、bashの

if [ check_log ]; 
then 
    ........statements.... 
fi 

かの状態でこの関数を呼び出しますか?私はここで混乱しています。なぜなら、bashは成功すれば0を返し、失敗した場合は1を返します。しかし、私の関数は1を返していて、条件は1/0をチェックしています。それは1になり、失敗を返すはずですが、私のシェルスクリプトの条件は合格です。

誰でもこの問題について話すことができますか?

ありがとうございます!

+0

[何か]何かをして[0]何もしない場合の数字はどれくらいですか – JumpOffBox

+0

bashでは、 '[]'や '[[] ''ではなく数字のコンテキストを使いますが、 (()) ' - そうです:' if((variable)); '変数'に0以上の数値が含まれている場合にのみtrueと評価されます。 –

+0

...ところで、 "bashを使う"ときは、あなたのshebangが '#!/ bin/bash'か' #!/ bin/sh'ではなく、#!/ usr/bin/env bash'を実行します。後者の場合、すべてのbash機能が有効になるわけではないので、ここに示されたすべてのアドバイスは有効ではありません。 –

答えて

35
if [ check_log ]; 

角括弧を使用すると、testコマンドが呼び出されます。これはif test -n check_logの略語であるif test check_logに相当します。これは、「"check_log"が空の文字列でない場合」を意味します。あなたのcheck_log関数を呼び出すことは全くありません。

これに変更し、それを:ところで

if check_log; 

に、機能がより簡単のように書くことができます

check_log() { 
    ! [ -f "/usr/apps/appcheck.log" ] 
} 

関数からの戻り値は、最後のコマンドの終了ステータスです、明示的なreturn文は必要ありません。

@ジョン・kugelman、一つの解決策(そしておそらく最も適切なもの)で述べたように
+0

数字について何か [6]何かして[0]何もしない場合 – JumpOffBox

+0

@JumpOffBox数値テストを実行するには、testコマンドの数値演算子の1つ、たとえばif [6 -ne 0];それから...。しかし、それらの数字の代わりに関数を使うことはできません。シェル関数を数学関数(値を返すことを主な目的とする)とは異なり、コマンド(成功または失敗)と考えるべきです。 –

+0

@GordonDavisson/bin/shではなくbashを明示的に対象としている人に '[]'を提示しないでください。 '((7)= 0))'ははるかに読みやすく(エラーが起こりにくい)、 '[[]]'のように '(())'は文字列分割とglob展開を抑制するので、引用符は文が予想外のデータ値であっても意図どおりに解析されるようにするために必要です)。 –

3

は、次の構文を使用することです:

if check_log; 

をしかし、代替ソリューションは、次のとおりです。

if [[ $(check_log; echo $?) -eq 0 ]]; 

私の個人的な好みは、条件付きステートメント間の一貫性を促進するため、後者です。しかし、欠点は です。コマンド置換に依存しているため、最初の方法では子プロセス(つまり、サブシェル)がforkされません。

テーマに関する興味深い読み取りがここで見つけることができます:更新

When does command substitution spawn more subshells than the same commands in isolation?

(2017年10月20日):私は上だこれらの日として第二の方法のための私の好みを取り消しします不要なフォークを防ぐミッション。第1の解決法の構文は、非シェルプログラミングにとって直感的ではないが、確かに効率的である。

+0

なぜ世界で2番目を好きですか? –

+0

@JohnKugelmanあなたの提案に基づいて私のコメントを更新しました。 – markeissler