2011-12-22 22 views
0

私はrootとしてスクリプトを実行しており、ユーザーoracleにORACLE_HOMEが定義されているかどうかを確認しようとしています。ここに私のスクリプトです:

su - $user << EOF 2>&1 
    if [ -n "${ORACLE_HOME:+x}" ] 
    then 
     echo "KO" > /tmp/oracle.tmp 
    else 
     echo "$ORACLE_HOME" > /tmp/oracle.tmp 
    fi 
EOF 

この作品はありません。それは私にif: Expression Syntax.を与え、ファイルは作成されません。私は問題がsuカプセル化であると思う。なぜなら、私がifステートメントだけを実行しているので、それが機能しているからだ。何か案が ?

そして、なぜ私がrootとして実行しているのか尋ねないでください。私はその悪い習慣を知っているが、私はそれについて何もできない。

+0

理由だけではない:エコー$ {ORACLE_HOME:-KO}> /tmp/oracle.tmpを? –

答えて

1

コードはおそらくbashで実行されるのではなく、代わりの値の構文をサポートしていないshで実行されます。

+0

これはできるだけジェネリックにするための提案がありますので、どのシェルでも実行できますか? – Michael

+0

さて、あなたは[-n "$ ORACLE_HOME"]で置き換えることもできます(どうしてここで代替値が必要なのですか?)あるいは、bashでコードを実行してください。 – choroba

+0

変数がoracleユーザーで設定されているかどうかを確認したいだけです。問題は、シェル・オラクル・ユーザーがどのシェル・ユーザーで実行されているかを制御できないため、私はコマンドをできるだけ一般的にする必要があります。私は別の値が何であるかわからない、私はシェルスクリプトの初心者です...あなたのおかげで何をお試しください。 – Michael

0

問題は引用符がヒアドキュメントを解析するシェルによって取り除かなっているので、コードが実行されていることです。

 
if [ -n ] 

その問題を解消するには、ヒアドキュメント内の文字列補間を避けたい、どのあなたがデリミタ引用して行うことができます。もちろん

 
su - $user << 'EOF' 2>&1 

、補間されるからORACLE_HOMEを防ぐことができますので、ORACLE_HOME環境(つまりである場合にのみ動作します、それはシェル変数ではなく、持っています輸出され、環境変数ですル)

質問に与えられたサンプルコードは単純化されていない限り、あなただけ行うことができます:

 
echo ${ORACLE_HOME:-KO} > /tmp/oracle.tmp 
関連する問題