bash関数から値を返す

数値が有効な10桁の数値である場合に1を返す関数があります:

valNum() { flag=1 if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then echo "Invalid Number" flag=0 fi return $flag } 

次のユーザーから呼び出されます:

if [[ $(valNum $num) -eq 1 ]]; then #do something fi 

数値が有効であるが構文が表示されている場合、関数は正常に機能しています無効な番号を入力するとエラーになります。

回答

@choroba “の回答は正しいですが、この例の方が明確な場合があります:

valNum $num valNumResult=$? # "$?" is the return value of the previous command if [[ $valNumResult -eq 1 ]] then : # do something fi 

この例は少し長くなっています($valNumResultを設定してからその値をクエリします)が、何が起こるかをより明確に説明しています:that valNum()は値を返し、その値をクエリしてテストできます。

PSよろしくお願いし、00に返してください。 div id = “c03be70399″>

およびfalseの場合はゼロ以外。これにより、戻り値を使用して、失敗した場合に「失敗した理由」を示すことができます。

回答

bashの関数は、終了コードのみを返すことができます。逆に、コマンド置換は、の標準出力を取得するために使用されます。コマンドまたは関数。したがって、返されたフラグを確認するために、置換は必要ありません。

if valNum "$num" ; then # ... fi 

ただし、それが機能するためには、次の場合は0を返す必要があります。番号は有効です、そうでない場合は1(終了コード0はエラーがないことを意味します)。

コメント

  • わかりません。 tldp.org/LDP/abs/html/complexfunct.html の例24.7では、関数は終了コードではなく最大値を返します。あなたの提案は機能していますが、なぜ機能しているのか理解できません
  • テストは入力が有効な10桁の整数であるかどうか、つまりtrueまたはfalseであるかどうかを確認することであるため、関数0または1を返します。choroba'の例は、if valnum "$num"if valnum "$num" = 0と同等であるために機能します。つまり、"がtrueの場合"です。 shスクリプトの基本的な経験則は、0 =真/成功、ゼロ以外=偽/エラーです。
  • BTW、"高度なBashスクリプトガイド"は'非常に優れたガイドではありません-'多くの点で間違っていますそして、いくつかの貧弱なスクリプト慣行を奨励します。 mywiki.wooledge.org/BashFAQ のBashFAQは、はるかに優れたリソースです。
  • unix.stackexchange.com/questions/12236/ …
  • 文字列

無効な数値"次に、if [[ $(valNum $num) -eq 1 ]]

回答

シェル関数から任意の結果を返すことはできません。 0から255までの整数であるステータスコードのみを返すことができます(returnに大きな値を渡すことはできますが、256を法として切り捨てられます)。値は0である必要があります。成功を示し、失敗を示す別の値。慣例により、1から125までのエラーコードに固執する必要があります。値が大きいほど特別な意味があります(126と127の外部コマンドが正しくないため、値が大きい場合はシグナルによって強制終了されます)。はいまたはいいえの結果はここにあり、ステータスコードが適切です。 flagは成功または失敗を示しているように見えるため、成功には0、失敗には1の従来の値を使用する必要があります(記述したものとは逆)。その後、ifステートメントで関数を直接使用できます。

valNum () { local flag=0 if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then echo 1>&2 "Invalid Number" flag=1 fi return $flag } if valNum "$num"; then #do something fi 

失敗コードを区別する必要がある場合は、関数を直接呼び出します。戻った直後に、失敗コードは$?にあります。次に、caseステートメントで確認できます。

valNum "$num" case $? in … 

後でステータスコードを使用する必要がある場合は、は次のコマンドで上書きされます。

valNum "$num" valNum_status=$? 

コマンド置換は関数の出力に展開されます。これは、コードではエラーメッセージまたは空であり、1ではありません。

必要な場合ステータスコードがシェル関数から許可するよりも多くの情報を渡すには、2つの可能性があります。

  • 標準出力にテキストを出力し、コマンド置換で関数を呼び出します。$(valNum "$num")
  • 関数内の1つ以上の変数に割り当て、後でそれらの変数を読み取ります。

回答

私自身この分野で矛盾する結果がありました。これが私の経験的実験の結果です。まず、bashまたは* nixコマンドに関するいくつかの「理論」:

  • SUCCESS == 0 …つまりエラーステータスコードなし)
  • FAIL              != 0 ……いくつかのステータスコード

例:

if ls -lt /nonexistantdir then echo "found" else echo "FAIL" fi # echo ls -lt /nonexistantdir; echo "status = $?" echo "status = $?" 

出力:

ls: cannot access "/nonexistantdir": No such file or directory FAIL... ls: cannot access "/nonexistantdir": No such file or directory status = 2 

示されているように、lsコマンドはステータスコード= 2を返します。有効なディレクトリを試行すると、ステータスはゼロ( 0 )。他のほとんどすべての言語と同じではありません。

ルール#1 -作成…

  • TRUE   == 0
  • FALSE!= 0

Bashでエラーコードをテストしていることを覚えておく必要がありますifステートメント。定数を設定するか、シェルのtrueまたはfalseコマンドを使用できます。

TRUE=0 FALSE=1 # valid number function # valNum() { flag=$TRUE if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then echo "Invalid Number" flag=$FALSE fi return $flag } # later on ... # if validNum Abc then echo "Lucky number" else echo "Not lucky." fi 

および出力:

Invalid Number Not lucky. 

ただし、「 up-vote “@ Gillesは、彼の答えが正しいからです。 ePaperの単純化した面を下にしたかっただけです。

もう1つ、 test コマンド。これは次のようになります:

[[ some-expression ]]; 

ほとんどの場合。例:

$ test 1 $ echo "result = $?" result = 0 $ test 0 $ echo "result = $?" result = 0 

Zero(0)は true 。どうして?マニュアルページには、1つの引数がNOT-NULLの場合、「 true 」であると記載されています。

参照:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です