2016-12-22 12 views
2

を失敗している私は、次のbashスクリプトを持っている:bashスクリプト - 出力に特定の文字列をチェックし

#!/bin/sh 
psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;" 

if [ $? -eq 0 ]; then 
    echo OK 
else 
    if [ $? = 'ERROR: database "test" already exists' ]; then 
     echo OK 
    else 
     echo FAIL 
    fi 
fi 

それは現在、次のエラーで失敗します:

testbox:/tmp# sh test.sh 
ERROR: database "test" already exists 
FAIL 

私がどこか分かりません間違ってしまった。この特定のエラーに対して「OK」を返す必要があります。それ以外のエラーはFAILを出力するはずです。 どこが間違っているか教えていただけますか?

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

#!/bin/bash 

output=$(psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;") 
ret=$? 

if [[ $ret -eq 0 ]]; then 
    echo OK 
else 
    if [[ $output == 'ERROR: database "test" already exists' ]]; then 
     echo OK 
    else 
     echo FAIL 
    fi 
fi 

しかし、私はこのエラーを取得する:

ERROR: database "test" already exists 
sh: ERROR: database "test" already exists: unknown operand 
FAIL 
+2

'$?'は 'psql'コマンドの出力ではなく整数の終了コードを表します。あなたは出力をつかんで確認する必要があります。 – anubhava

+0

@anubhava ok。あなたは私に例を教えてくれますか? – Happydevdays

+1

@Happydevdays: 'psql'コマンドの直後に' echo $? 'を追加すると、anubhavaの意味を知ることができます。次に、2番目の 'echo $?'を追加すると、最初の 'echo'コマンドが成功したので、状態コード0で終了したので、" 0 "を表示します。 –

答えて

4

$?はちょうど整数を表し、私は出力だけでなく、RCをキャプチャするために、コードを変更した

EDIT 1

終了コードはpsqlコマンドの出力ではありません。 psqlコマンドの出力を取得し、ifの状態をチェックする必要があります。

あなたは使用することができます。

#!/bin/bash 

output=$(psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;" 2>&1) 
ret=$? 

if [[ $ret -eq 0 ]]; then 
    echo OK 
else 
    if [[ $output == *'already exists'* ]]; then 
     echo OK 
    else 
     echo FAIL 
    fi 
fi 
+0

エラーで失敗しました。 – Happydevdays

+0

私は 'psql'コマンドからもstderrを取得するように' output = $(psql -U postgres -c "CREATE DATABASE test TEMPLATE template0;" 2>&1) 'に最初の行を変更しました。 – anubhava

+1

それは今動作します。ありがとうございました。最初の行の最後に "2>&1"をよく理解するにはどうすればよいですか? – Happydevdays

0

$?意志出力整数を最後に実行したコマンドの終了コードに基づきます。 データベースが存在する場合は、1が返されます。それはあなたのスクリプトが失敗している理由です。

0

データベースが存在するかどうかを確認すると、より短い方法でhereが見つかります。

この出力に基づいて、データベースを作成して有意義な結果を返すことができます。

関連する問題