"while test $# -gt 0"は何をしますか?

"while test $# -gt 0"は何をしますか?

関数を作成しようとするのに良い例を見つけたと思いますが、後ろに隠れているロジックをすべて理解していません。

より具体的に言えば、「while」行で誰かがテストが何であるか、何をしているかを説明できますか? $#とは何ですか(#コメント文字ではありませんか?) -gt 0パラメータはどこから来ましたか? while のマニュアルページにありません。

例は次のとおりです。

function my_function()
{
while test $# -gt 0
do
    $
echo "$1"
    shift
done
}

ありがとうございます。

答え1

#それ自体は明らかにコメントですが、関数$#に渡された引数の数を含みます。

testある数字が他の数字より大きいかどうかなど、さまざまなテストを実行できるプログラムです(演算子があれば-gt他の演算子が多いので参照man test)。テストが成功した場合(この場合はthe number of parametersISが0より大きい場合)、成功を返します。

このshiftコマンドは最初の引数を削除します。また減少$#

完全なコードは次のように考えることができます。引数を使用して操作を実行し(この場合は画面に表示)、引数が残りなくなるまで繰り返します。

デバッグに役立つ残りのパラメータをすべて表示するには、次の点を確認してください。$@

答え2

$#==>スクリプトパラメータを渡す

test==>条件付き評価コマンド

-gt==>代表より良い

test a -gt b==> aがbより大きい場合はtrue、それ以外の場合はfalse

一緒に入れてください:

while test $# -gt 0==>より多くのパラメータが渡されると(交互に変更されました)

状況が厳しくなる部分は、shiftwhileループ本体の内部です。

$1==>は常に最初のパラメータを表します。

aこれをより具体的にするためにパラメータとをb渡すとしますc

$1==>はaこれが最初のパラメータであることを意味します。

今すぐ呼び出すとパラメータリストshifta存在するため、b今すぐ呼び出すとcリストの最初のパラメータになります。パラメータリストをもう一度呼び出して今すぐ状態にします。再度呼び出すとパラメータリストが空になるため、while条件が成功せず(パラメータリストが0より大きくなくサイズが0になるため)、whileループが終了します。$1bshiftc$1cshift

現在のパラメータを使用して参照すると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+}組み込み関数です。交換失敗が設定されていない場合、条件が評価され、ループが中断されます。:truewhile$1falsewhile

whileループが繰り返されるたびに成功すると、_fn() echoesの$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().

関連情報