関数を作成しようとするのに良い例を見つけたと思いますが、後ろに隠れているロジックをすべて理解していません。
より具体的に言えば、「while」行で誰かがテストが何であるか、何をしているかを説明できますか? $#とは何ですか(#コメント文字ではありませんか?) -gt 0パラメータはどこから来ましたか? while のマニュアルページにありません。
例は次のとおりです。
function my_function()
{
while test $# -gt 0
do
$
echo "$1"
shift
done
}
ありがとうございます。
答え1
#
それ自体は明らかにコメントですが、関数$#
に渡された引数の数を含みます。
test
ある数字が他の数字より大きいかどうかなど、さまざまなテストを実行できるプログラムです(演算子があれば-gt
他の演算子が多いので参照man test
)。テストが成功した場合(この場合はthe number of parameters
ISが0より大きい場合)、成功を返します。
このshift
コマンドは最初の引数を削除します。また減少$#
完全なコードは次のように考えることができます。引数を使用して操作を実行し(この場合は画面に表示)、引数が残りなくなるまで繰り返します。
デバッグに役立つ残りのパラメータをすべて表示するには、次の点を確認してください。$@
答え2
$#
==>スクリプトパラメータを渡す
test
==>条件付き評価コマンド
-gt
==>代表より良い
test a -gt b
==> aがbより大きい場合はtrue、それ以外の場合はfalse
一緒に入れてください:
while test $# -gt 0
==>より多くのパラメータが渡されると(交互に変更されました)
状況が厳しくなる部分は、shift
whileループ本体の内部です。
$1
==>は常に最初のパラメータを表します。
a
これをより具体的にするためにパラメータとをb
渡すとしますc
。
$1
==>はa
これが最初のパラメータであることを意味します。
今すぐ呼び出すとパラメータリストshift
がa
存在するため、b
今すぐ呼び出すとc
リストの最初のパラメータになります。パラメータリストをもう一度呼び出して今すぐ状態にします。再度呼び出すとパラメータリストが空になるため、while条件が成功せず(パラメータリストが0より大きくなくサイズが0になるため)、whileループが終了します。$1
b
shift
c
$1
c
shift
現在のパラメータを使用して参照するとshift
どのような利点がありますか$1
?
スクリプトに渡されたパラメータの数を事前に知ることができず、とにかくwhileループでパラメータを1つずつ繰り返しながら、常に現在のパラメータを参照できる柔軟性を提供します。$1
これはスクリプトのヘッドパラメータを意味するためです。リスト。最終的にshift
パラメータリストは空になるので、無限ループを終了するのではなく、while条件を使用してゼロより大きいことを確認することが重要です。
答え3
変数の意味を理解するには、次のスクリプトを実行してください。スクリプトを別の名前で保存somescript.sh
し、いくつかの入力パラメータを使用してスクリプトを呼び出します。
#!/bin/bash
echo "I display the total parameters passed to this script from commandline"
echo $#
echo "I display all the parameter values"
echo "Input: $@"
echo "I display the first parameter value"
echo "$1"
shift
echo "After shift: $@"
答え4
私の答えのいくつかを繰り返すことを許してください。これは役に立つと思います。
_fn() { set -- "$@" $(cat)
while ${1+:} false ; do
echo "$1" && [ "$1" = "arg2" ] && echo "$1"
$YOUR_CHK
shift
done
}
echo "arg2" | _fn "arg1"
出力
arg1
arg2
arg2
cmd行パラメータを処理し、パラメータ配列に1つ以上のパラメータが格納されていることを確認するためにループのみをstdin
実行します。while
チェックするすべてのパラメータを削除するので、$YOUR_CHK
貴重な情報を何とか保存することがその一部である必要があります。
_fn
内容がスクリプト本体またはシェル関数型の場合、動作は同じです。
_fn
処理stdin
- この場合、最初の行の - または - は、位置引数シェル配列をコマンドラインに渡された値に設定することでオーバーライドされ、"arg2" echo
すべて|pipe
が吐き出されます。set
$@
"$@"
cat
$(comand substitution)
while _fn's $1
最初のパラメータは、ループ条件を満たすために置き換えるシェルの${set+}
組み込み関数です。交換失敗が設定されていない場合、条件が評価され、ループが中断されます。:true
while
$1
false
while
while
ループが繰り返されるたびに成功すると、_fn() echo
esの$1
最初のパラメータは次のようになります&&
。echo
いつも成功) 文字列と同じであることを[ tests ]
確認し、 es が再び成功した場合に確認します。$1
"arg2"
&&
[ test ]
_fn() echo
$1
$YOUR_CHK
動作しません。シェルがコードを実行する前に null と評価される未設定変数。
ループが繰り返されるたびに最初の引数をwhile
削除shift
します。$1
したがって、繰り返し1では次の"$@"
ようになります。
arg1 arg2
しかしshift
、最初以降は次のようになります。
arg2
最後の時間以降はshift
次のようになりました。
${1+:} false
これでリセットされていないため、$1
シェルは交換されず、評価:true
のみが実行されるため、ループはfalse
中断され終了します。while
_fn().