Bash シェルを使用して回答します。

Bash シェルを使用して回答します。

授業の課題が期限になっているのですが、「畏敬の念」について何も見つけられません。

課題では、3 つの質問の後に「Linux は素晴らしいから!」という言葉を繰り返す「awe」という関数を含むスクリプトを作成するように指示されています。

私はこのことについて全くの初心者なので、本当に助けていただきたいです。試してみましたawkが、このことについて見たビデオから判断すると、これは彼が望んでいることではないようです。ありがとうございます。

答え1

Bash シェルを使用して回答します。

課題では、3 つの質問の後に「Linux は素晴らしいから!」という言葉を繰り返す「awe」という関数を含むスクリプトを作成するように指示されています。

課題では関数を作成するように言われているので、Bashマニュアルについて教えてくれる機能:

シェル関数は、グループに単一の名前を使用して、後で実行するためにコマンドをグループ化する方法です。これらは、「通常の」コマンドと同じように実行されます。シェル関数の名前が単純なコマンド名として使用されると、その関数名に関連付けられたコマンドのリストが実行されます。シェル関数は現在のシェル コンテキストで実行され、それらを解釈するための新しいプロセスは作成されません。

関数は次の構文を使用して宣言されます。

name () compound-command [ redirections ]

または

function name [()] compound-command [ redirections ]

これは、シェル関数を定義します。名前予約語functionはオプションです。function予約語が指定されている場合は、括弧はオプションです。関数の複合コマンド複合コマンド(見る複合コマンド)。そのコマンドは通常、リスト{ と } で囲まれますが、上記の複合コマンドも使用できます。ただし、例外が 1 つあります。function予約語が使用されているが括弧が指定されていない場合は、中括弧が必要です。複合コマンドいつでも実行される名前コマンドの名前として指定されます。

簡単に言うと、関数とは、指定した名前(関数の名前)の下にまとめられたコマンドのセットです。

代入は、関数の名前の付け方(awe)と、この関数が何をするか(「Linuxは素晴らしい!」という出力)を指定します。このメッセージを出力するには、 を使用しますecho。Bashechoがシェル組み込みとして提供する コマンドは、出力に使用されます。stdout(コンソール) この情報を基に、関数を記述できます。

awe(){
    echo "Because Linux is Awesome!"
}

次の課題は、3つの質問をした後に実行することです。これには、readいくつかのオプションフラグを受け入れることができるコマンドを使用できます。bash マニュアル私たちに伝えるについてread:

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars]
    [-N nchars] [-p prompt] [-t timeout] [-u fd] [name …]

1行は標準入力またはファイル記述子から読み込まれます翻訳 オプションの引数として提供され-u、上記のように単語に分割されます単語の分割、最初の単語が最初の名前、2番目の単語から2番目の単語名前など。名前よりも単語の数が多い場合は、残りの単語とそれらの間の区切り文字が最後の名前入力ストリームから読み込まれた単語が名前より少ない場合、残りの名前には空の値が割り当てられます。変数の値の文字は、IFSシェルが展開に使用するのと同じルールを使用して行を単語に分割するために使用されます(上記の単語の分割)。バックスラッシュ文字 ' \' は、次に読み取られる文字と行継続の特別な意味を削除するために使用できます。名前が指定されていない場合、読み取られた行は変数 に割り当てられますREPLY

readいくつかのオプションを受け入れます。この場合、ユーザーに質問して入力を取得したいので、2 つのオプションが最も関連しています。それらのオプションは次のとおりです。

  • -r→ このオプションが指定された場合、バックスラッシュはエスケープ文字として機能しません。バックスラッシュは行の一部とみなされます。特に、バックスラッシュと改行のペアは行の継続として使用できません。
  • -p prompt→ 表示プロンプト入力を読み取ろうとする前に、末尾に改行を付けずにプロンプ​​トを表示します。このプロンプトは、入力が端末から行われる場合にのみ表示されます。

を忘れることは最悪の状況ではありませんが、エスケープ文字として動作しないよう-rにするために、ほとんどの場合、 を含める必要があります。はユーザーにプロンプ​​トを表示します。 1 つの の後に両方のオプションを置くことができるため、次のように記述できます。\-p-

read -rp "Question? " variable

ユーザーの入力は に保存されていますvariable。その入力を、ユーザーに出力する文に含めることで使用したいのです。variable保持されている値に展開するには、$その前に を置きます。これは二重引用符内でも機能します。

echo "This is a reply to the user and it contains $variable!"

通常、この課題を解決するにはこれだけで十分です。私のサンプルスクリプトでは、最後の質問で「はい」か「いいえ」のどちらが答えられたかに応じて条件を設定するという、ちょっとした工夫を加えifました。それでは、もう一度見てみましょう。マニュアルがif条件について教えてくれること:

コマンドの構文は次のとおりifです。

if test-commands; then
  consequent-commands;
[elif more-test-commands; then
  more-consequents;]
[else alternate-consequents;]
fi

テストコマンドリストが実行され、その戻りステータスがゼロの場合、結果コマンドリストが実行されます。テストコマンドゼロ以外のステータスを返すと、各elifリストが順番に実行され、終了ステータスがゼロの場合、対応するさらなる結果が実行され、コマンドが完了します。 ' ' が存在し、最後のor節の最後のコマンドの終了ステータスがゼロでない場合は、else alternate-consequentsifelif代替結果が実行されます。戻りステータスは、最後に実行されたコマンドの終了ステータス、または真とテストされた条件がない場合はゼロになります。

以下の例test-commandで使用した は[、条件が真か偽かをテストするシェル組み込み関数です。 を使用する場合は[、最終引数 を渡す必要があります]=は、変数が文字列として等しいかどうかをテストします。

それで、サンプルスクリプトは次のようになります。

#!/bin/bash

# function 'awe' to output "Because Linux is Awesome!"
awe(){
    echo "Because Linux is Awesome!"
}

# asking three questions
read -rp "Enter your name!: " name
echo "Well, hello then $name!"
read -rp "How old are you?: " age
echo "Being $age makes you nearly as old as I am"
read -rp "Do you like Linux?: " likes_linux

# acting on if the last input is yes or something else in which case we assume no
if [ "$likes_linux" = "yes" ];then
    awe
else
    echo "Why don't you like Linux?"
fi

関連情報