私はシェルとUNIX/GNU/Linuxに初めて触れました。
再帰関数の一部として構文を理解しようとしています。
[ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
(からインポートここ)
完全な関連機能は次のとおりです。
factorial(){
local i=$1
local f
declare -i i
declare -i f
[ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
}
[$i -le 2 ]
位置引数が2つ以上あることを確認することを意味することを理解してください。二重バレル表記法(または?)が何であるかを理解していません。あなたはまた何をしますか{}
?ループのパラメータは4つですか?
ありがとう、David
ベストアンサー1
まず、
local i=$1
$ 1の値をiに割り当てます。 $ 1は関数の最初のパラメータです。または、関数の外部では、コマンドまたはスクリプトの最初の位置引数を表します。
以下は非常に直感的です。 -i は変数が整数であることを示します。
local f
declare -i i
declare -i f
それでは長い話をしましょう。明確にするために、これを別々の行に分割します。
[ $i -le 2 ] #checks if $i is less or equal 2
&& #this is logical AND. This is used so: X && Y, meaning if X computes to true, then compute Y. So for this function, the meaning is: if $i less or equals 2, do the following:
echo $i #this follows the logical && above, so is computed conditionally. Namely, print $i.
|| #this is logical OR, so what follows is computed only if what's on the left boils down to false.
#Here the meaning is, IF NOT $i -le 2 AND echo... (which doesn't matter), do what's on the right. So do what's in the {} braces, if $i is greater than 2.
もう残ったのはこれだ。
{ f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }
中かっこ {} は、エンティティとして扱われるブロック内の内容を作成します。ここでの状況を最も簡単な方法で説明するために、前に&&と||ロジックを紹介しました。これでブロック全体に適用されます。今部品に進みます。
f=$(( i - 1));
$(( )) は算術演算子です。 f=今頃ならご存じでしょう。完全な式は、f
その式に割り当てられた値を意味しますi - 1
。
ブロックのさまざまな部分がセミコロンで終わる方法を確認してください;
。
f=$(factorial $f);
この関数は上記で呼び出されました。これが再帰が入るところです。文字通りの意味:f
引数を使用して呼び出された関数の階乗に割り当てられた戻り値。$f
(割り当てには$が必要ないことがわかります。$( )
)コマンドの置き換え。単に名前で関数を呼び出すことで関数を呼び出すことができますが、変数値の割り当ての場合、値は何とか渡されなければならず、これがここで行われる方法です。
f=$(( f * i ));
上から再び算術演算子を見ることができます$(( ))
。f
ここで得られた値(この時点でtimesとf
同じ)は、関数の$ 1パラメータと同じです。$(factorial $f)
i
最後に印刷された値は次のとおりですf
。
echo $f;