2020/11/12
Linuxシェルプログラミングは初めてですが、慣れていません。今日は、反復関数を使って単純な階乗を見つけたいと思っています。数時間作業した後、書き留めておく必要があると思います。
1.タイトル
nの階乗を実現するプログラム、n = 10。
2.しばらくの間従事する
これは比較的単純です:
n=10
i=$n
ans=1
while [ $i -gt 1 ]
do
let ans=`expr $ans \* $i`
let i=`expr $i - 1`
done
echo $n"! ="$ans
もちろん、これら2つの変換が非常に簡単で、判断条件のみが異なるまで使用することもできます。
3.反復関数
以前に他の言語で反復関数を書いたとき、それは非常に単純だと思いましたが、次のようなシェルで書きました:
#!/bin/bash
function fac()
{
n=$1
if [ $n -eq 1 ]; then
return 1
else
let m=`expr $n - 1`
s=$(fac $m)
return $(($n*$s))
fi
}
echo $(fac 10)
もちろん、これは最初のバージョンではありません。これは私が多くの側面を変更し、最後に最も少ないエラーを報告したものです。ここに到着した後、戸惑い、ついにブログを見つけました。突然、ブログのリンクが次のようになっていることに気づきました。
この前任者の例は、関数に文字列を返すようにすることであり、関数によって返される結果に値を乗算する必要があります。前任者はついに書いた:
シェル関数の戻り値は整数値のみにすることができます。これは通常、関数が正常に実行されたかどうかを示すために使用されます。0は成功を示し、その他の値は失敗を示します。したがって、関数の戻り値を使用して関数の実行結果を返すことは適切ではありません。文字列などの計算結果を突然返したい場合は、「数値引数が必要です」というエラーメッセージが表示されることがよくあります。
関数に1つ以上の値を返す必要がある場合は、グローバル変数を定義し、関数が計算結果をグローバル変数に割り当ててから、スクリプトの他の場所でグローバル変数にアクセスすることにより、その関数を1つ以上実行します。返品」が得られることが判明しました。
関数の戻り値を取得する方法を要約します
。1)変数を使用して関数の戻り値を受け取り、関数はエコーおよびその他の標準出力を使用して、返される内容を出力します。
2)$?
レシーバー関数の実行状態になりますが$?
、関数呼び出しの直後になります。
はい、グローバル変数を使用します。
#!/bin/bash
s=1 #全局变量
fac()
{
n=$1
if [ $n -eq 1 ] ; then
s=$(($s*1))
else
let m=`expr $n - 1`
s=$(($s*$n))
fac $m
fi
}
fac 10
echo $s
変数はデフォルトでグローバル変数であることに言及する価値があります-関数本体が変数がローカル変数(local var
)であることを明確に示していない場合、それはグローバル変数です。
関数の戻り値を取得する方法を要約します
。1)変数を使用して関数の戻り値を受け取り、関数はエコーおよびその他の標準出力を使用して、返される内容を出力します。
2)$?
レシーバー関数の実行状態になりますが$?
、関数呼び出しの直後になります。