私は現在ここにあるシェルスクリプトのチュートリアルに従っています。
http://www.cs.columbia.edu/~sauce/tutorial/ashell.html私は私のスクリプトがこのスクリプトに完全に収まると思います。ただし、例を実行しようとすると、出力が一致しません。あいまいに聞きたくないし、「なぜ動作しないの?」と聞きたくないので、理解できない部分に集中します。コマンド":"
の後になぜありますかtestlogin:
?私は" : "
(両側にスペース)と先行の意味を議論する多くのフォーラムを読んだが、後の":"
コロンの使用については何も読んでいない。この文脈では、どういう意味ですか?これがタイプミスの場合、例で正しく機能しない可能性がある別のタイプミスを見つけるのに役立つ人はいますか?
どんな助けでも大変感謝します!
コード(上記にリンクしたウェブサイトから正確にコピーしました)は次のとおりです。
#testlogin
useron(){
if ( who | grep $1 > /dev/null)
then echo $1 is logged in
else echo $1 is not logged in
fi
}
if test $# != 1
then echo testlogin: username
else useron
fi
そして出力
paul@paul-LC22UP:~$ .testlogin paul
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
is no logged in
ベストアンサー1
testlogin
これはコマンドではなくパラメータですecho
。完全なコマンドは次のとおりです。
echo testlogin: username
echo
STDOUTに提供したテキストを吐き出すだけです。したがって、コロンは特別な意味を持たず、蓄積的な出力の一部ですecho
。無効な数の引数を使用してスクリプトを呼び出すと、出力は次のようになります。
$ ./testlogin
testlogin: username
$ ./testlogin fred bill adam
testlogin: username
これは奇妙な出力ですが、必ずしもタイプミスではありません。私は通常、次のことをもっと楽しみにしています。
$ ./testlogin
Usage: testlogin username
スクリプト全体がうまくいかないのは、作成者がuseron
関数を呼び出すときに微妙な間違いを犯し、おそらく投稿する前にスクリプトをテストしていないためです(あるいは、作成者もあなたと同じ間違いを見つけました)。関数$1
はuseron
最初のパラメータです。その機能に、スクリプト全体ではなくuseron
引数なしで呼び出されたため、空の文字列なので、最終的に次のコマンドが実行されます。
$ who | grep
grep
これはsの使用法情報を提供し、常にelse
条件分岐をトリガします。次のように、最初のパラメータをスクリプトに渡すことでこの問題を解決できますuseron
。
else useron $1