私の関数呼び出しが以下のif条件でブール値として評価されないのはなぜですか?
関数呼び出しから返すときに数値をブール値として使用する必要がありますか?
#!/bin/bash
#Script to wait for log file to start and open it using less
function is_log_started()
{
if test -f "log/server.log"; then
return true
fi
return false
}
if [ is_log_started = true ]; then
echo "log started"
fi
答え1
シェル関数は0から255の整数のみを返すことができます。これは実行可能ファイルに適用されるのと同じ制限です。数値以外の引数を渡すと、他のシェルが異なる反応をします。 bash はエラーメッセージを出力します。
$ bash -c 'f () { return true; }; f; echo $?'
bash: line 0: return: true: numeric argument required
2
プログラムを終了するのと同様に、trueの場合は0を、falseの場合は1から125の値を渡します。 126から255の間の値も偽ですが、一般的な意味を持ちます(プログラムを開始できないか、信号によってプログラムが終了します)。
function is_log_started()
{
if test -f "log/server.log"; then
return 0
fi
return 1
}
しかし、書く方法が複雑です。
function is_log_started
{
test -f "log/server.log"
}
シェル関数の戻り状態は、最後に実行された文の戻り状態です。
あなたのテストも間違っています。とが同じ文字列かどうかを[ is_log_started = true ]
テストします。関数呼び出しの戻り状態が true かどうかをテストするには、関数を呼び出すだけです。すべてのシェルコマンドはすでにブールです。コマンドが0を返す場合はtrue、それ以外の場合はfalseis_log_started
true
function is_log_started
{
test -f "log/server.log"
}
if is_log_started; then
echo "log started"
fi
答え2
既に知っていますが、機能を完全に削除して以下を使用できます。
if [ -f "log/server.log" ] ; then echo "log started" ; fi
答え3
作成したとおり、文字列 "is_log_started"と "true"を比較しており、後者は常にfalseです。
テストは次のようにする必要があります。
if is_log_started; then
そして、テストを完了するには、関数は実際にはtrue(0)またはfalse(例:1)を返す必要があります。