数値が有効な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よろしくお願いし、0
を0
に返してください。 div id = “c03be70399″>
およびfalse
の場合はゼロ以外。これにより、戻り値を使用して、失敗した場合に「失敗した理由」を示すことができます。
回答
bashの関数は、終了コードのみを返すことができます。逆に、コマンド置換は、の標準出力を取得するために使用されます。コマンドまたは関数。したがって、返されたフラグを確認するために、置換は必要ありません。
if valNum "$num" ; then # ... fi
ただし、それが機能するためには、次の場合は0を返す必要があります。番号は有効です、そうでない場合は1(終了コード0はエラーがないことを意味します)。
コメント
無効な数値"次に、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 -作成…
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 」であると記載されています。
参照:
if valnum "$num"
がif valnum "$num" = 0
と同等であるために機能します。つまり、"がtrueの場合"です。 shスクリプトの基本的な経験則は、0 =真/成功、ゼロ以外=偽/エラーです。