次のようなbashスクリプトがあります:
rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $?
このスクリプトを実行すると、次のプロセスに値が返されますが、スクリプトが正常に実行され、スクリプトのすべてのステージが正常に実行されても、1が返されます。
このため-次のプロセスは実行されません。
returnステートメントを削除すると、次のプロセスはスムーズに進みます。この問題は、Ubuntu14と新しいクラスターにUbuntu16があるHadoopクラスターのアップグラデーションの後に発生しました。
returnコマンドを削除すると、問題の内容と次のプロセスが正常に実行される方法を理解するのに役立ちます。ここで、Returnステートメントを削除した場合の本番環境への影響は何ですか?
コメント
- 次のステップは何ですか?次のステップは正確に何をチェックしますか?
- 次はHQL(Hadoopのハイブクエリ)であり、戻り値をコメントすると実行されるビジネスステップがいくつかありますが、コメントすると実行されません。戻ります。 'ビジネスロジック/シェルスクリプトの変更はありません。アップグレードするだけです
回答
return
ステートメントは、ステートメントが関数から実行されない場合、エラーを返します。
シェル関数では、 return
を使用します。スクリプトでは、exit
を使用します。
#!/bin/bash return 0
のような短いスクリプトはエラーメッセージ
line 1: return: can only `return" from a function or sourced script
すると、$?
が1に設定されます。
「明示的なexit
でスクリプトを終了しないでください(または、終了コードを指定せずにexit
で終了する場合)、戻りコードはスクリプト全体は、最後に実行されたコマンドと同じになります。
exit "$?"
を持つことは、プレーンなexit
であり、スクリプトの最後にある場合は、完全に省略できます。
一般に、$HOME
。これは、$HOME
が他の変数と同じように機能するのに対し、チルダは別の展開ステップで展開されるためです。つまり、チルダは変数として動作せず、引用符で囲まれた文字列では展開されません。 。 $HOME
もより説明的であり、スクリプトであるため、コードを読みやすくするためにいくつかの追加のキーストロークを費やすことができます。
コメント
- 上記の応答について簡単なクエリがあります。exist0で上記を試しますが、この問題が発生する理由が1つあります。以前は同じクエリを使用していましたか?コメントを返すと機能します。ステートメントは何か影響がありますか?
- @gsrao
return
ステートメントをコメントアウトすると、スクリプトの戻りコードは最後に実行されたコマンドのコードになります。ですから、ここでのあなたの場合は、間違いなく省略できます。これを私の答えに追加します。 - ああ、すごい..あなたは私の命を救っています。スクリプトは最後のコメントの成功フラグ(rmdir〜 / sqoop / " $ TABLE ")を返しますよね?私の脳を食いつぶしている2つの簡単なクエリの場合1)私の場合
return $?" " return $にコメントすると、同じように機能します。 " 2)これまでに問題を引き起こした可能性があるものは何ですか?
return
('は関数に含まれていないため、私が見る限り、最初からそこにあるべきではありません。 )、スクリプトの終了ステータスはrmdir
のステータスになります('がスクリプトの最後のコマンドの場合)。最後の質問ですが、'これまでの"問題の意味がよくわかりません"。