*nixの末尾の「:」(コロン)とはどういう意味ですか? [閉鎖]

*nixの末尾の「:」(コロン)とはどういう意味ですか? [閉鎖]

私は現在ここにあるシェルスクリプトのチュートリアルに従っています。 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

echoSTDOUTに提供したテキストを吐き出すだけです。したがって、コロンは特別な意味を持たず、蓄積的な出力の一部ですecho。無効な数の引数を使用してスクリプトを呼び出すと、出力は次のようになります。

$ ./testlogin
testlogin: username
$ ./testlogin fred bill adam
testlogin: username

これは奇妙な出力ですが、必ずしもタイプミスではありません。私は通常、次のことをもっと楽しみにしています。

$ ./testlogin
Usage: testlogin username

スクリプト全体がうまくいかないのは、作成者がuseron関数を呼び出すときに微妙な間違いを犯し、おそらく投稿する前にスクリプトをテストしていないためです(あるいは、作成者もあなたと同じ間違いを見つけました)。関数$1useron最初のパラメータです。その機能に、スクリプト全体ではなくuseron引数なしで呼び出されたため、空の文字列なので、最終的に次のコマンドが実行されます。

$ who | grep

grepこれはsの使用法情報を提供し、常にelse条件分岐をトリガします。次のように、最初のパラメータをスクリプトに渡すことでこの問題を解決できますuseron

else useron $1

答え2

あなたがリンクしたウェブサイトの品質は非常に低いですshell scripts
あなたの質問に事前に答えると、「末尾のコロン」はシェルに特別な意味を持たず、画面に印刷される文字列の一部にすぎません。

ただし、ページのコードには次の欠陥があります。

  • あなたが学ぶべき最も重要な問題は「拡張機能の引用」です。
    これは「パラメータ拡張」(変数)ですが、他の拡張もあります。
    これが私がこの記事を書いた主な理由です。拡張子を引用しない習慣を挙げることは非常に悪い習慣です。

  • 言及されていないシェボン機構ページのどこでも。 (これは最初の行が#!/ bin / bashまたはそれに似ていることを意味します)

  • 11行目には関数呼び出しの引数がありません。次else useron "$1"のようになります。else useron

これら3つの明らかなエラーの後にスクリプトを実行できます。

$ testlogin
testlogin: username

ご覧のとおり、10行の文字列はコンソールにそのまま印刷されます。
末尾のコロンは:シェルに何の意味もありません。これは、文字列が次のように引用されると明確になります。

then echo "testlogin: username"

実際、IMOは以下のように明確に説明しています。

then echo "A parameter is needed, type something like 'testlogin: username'"

引数なしでスクリプトを実行すると、便利な答えが印刷されます。
ユーザー名を作成することもできます。

$ testlogin joe
joe is not logged in

上記の変更を実行するスクリプトは次のとおりです。

#/bin/sh
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 "Parameter missing, type something like 'testlogin: username'"
else  useron "$1"
fi

今、2番目の質問は次のとおりです。

  • ほとんどのシェルでは、外部testコマンドは廃止されました。完全に同等のシェルまたはより現代的なシェルに
    置き換えられました。スクリプトで使用されている行:は次のように置き換える必要があります。[[[if test "$#" != "1"

    if    [ "$#" != "1" ]
    
  • それでは、書き込みスタイルについて話しましょう。現代では、次のスクリプトを書くのがより一般的です(しかしこれは個人的な好みの問題です)。

#/bin/sh
useron(){
    if ( who | grep "$1" > /dev/null); then
        echo "$1 is logged in"
    else
        echo "$1 is not logged in"
    fi
}

if  [ "$#" != "1" ]; then
    echo "Parameter missing, type something like 'testlogin: username'"
else
    useron "$1"
fi

関連情報