終了コードステートメントを含む if ステートメント

終了コードステートメントを含む if ステートメント

私は Linux/Unix の初心者です。ここに課題があります。すべてをここに投稿するには長すぎます。https://i.stack.imgur.com/v2AJR.jpg

これが私の考えです:

このコードは、ユーザーが引数を入力したかどうかを確認します。else の下に何を入れればよいかわかりません。別のユーザーからここで学んだ which ステートメントについては話したことがないので、使用することは想定されていません。これは単なる基本的なコマンドであり、非常に高度な課題ではありません。

if [ $# -ne 1 ]; then
        echo Please enter a single, valid user id: 
        read userid
else
        userid=$1
        **what goes here?**
fi

ユーザーのフルネーム (例: Ben Franklin) を表示するために、私が作成してテストしたコードは次のとおりです。

grep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'

ユーザーがログインしているかどうかを判断します。

ユーザーがログインしていない場合(終了コード 1 を返します):who | grep $userid

  1. 次にgrep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'ANDを表示するecho is NOT currently logged on コード 1 でスクリプトを終了します。

ユーザーがログインしている場合(終了コード 0 を返します):who | grep $userid

  1. 次にgrep "$userid" /etc/passwd | cut -d: -f5 | sort | sed 's/^\(.*\), \(.*\)$/\2 \1/'ANDを表示するecho is currently logged on コード 0 でスクリプトを終了します。

ユーザーが有効かどうかを判断します。

ユーザーが無効な場合(終了コード 1 を返します):grep $userid /etc/passwd

  1. すると次のように表示されるはずですecho "The user you entered, $userid is not a valid user on this system."

ユーザーが有効な場合(終了コード 0 を返します):grep $userid /etc/passwd

このスクリプトはどのように記述すればよいですか? 全体の構造はどのようなものですか? 構造/セットアップで行き詰まっています。

答え1

これは課題のように見えるので、ツールといくつかのヒントだけを提供します。

  1. スクリプトに引数が与えられていない場合、$1(スクリプトの最初の引数)は空になります。これは でテストできます[[ -z $1 ]]多すぎる引数の場合、引数の数をテストします[[ $# -eq 1 ]](引数が 1 つの場合は true になります)。

  2. コマンドを使用して、ユーザーのエントリgentent passwd "$username"を取得できます。ユーザーが存在しない場合は、コマンドは 0 以外の終了ステータスで失敗します。つまり、 を使用して、存在しないユーザーに対応できます。passwd$usernameif ! getent passwd "$username" >/dev/null; then ...; fi$username

  3. passwdユーザーのエントリの5番目のフィールドいつものユーザーのフルネームが含まれます (「firstname lastname」形式である保証はありません)。エントリの末尾に余分なカンマが含まれている場合があり、削除する必要があります。 をgetent passwd "$username"使用して出力を解析しcut -d: -f 5、5 番目のフィールドを取得してから、 を使用して最初のカンマから削除できますname=${name%%,*}

    一部のシステムでは、ユーザーのフルネームに&文字が含まれている場合があります。そのようなシステムでは、この文字をユーザー名に置き換える必要があります (ユーザーの&名前がになるように)。Linux が一般にこれを実行するかどうかはわかりませんが、 を使用すれば実行できます。System &operatorSystem operatorname=${name/&/$username}

  4. このwhoユーティリティは、現在ログオンしているユーザーのリストを出力します。$usernameこれと照合するには、 を使用しますgrep -e "^$username\>"。 は\>単語の末尾に一致するため、egantonyは検索時に一致しませんanton。または、 はステートメントgrep -q内で役立ちますif

コード構造は次のようになります。

  1. 無効な引数をチェックして処理します (不足: read、多すぎる: exit または単に first を使用します)。1 つのifステートメント。
  2. 無効なユーザー名をチェックして処理します。 1 つのifステートメント。
  3. ユーザーのフルネームを取得します。コマンド置換による変数の割り当て。
  4. ユーザーがログオンしているかどうかを確認します (および出力します)。 1 つのifステートメントで、elseブランチが含まれる場合もあります。

このスクリプトにはループがないので、いくつかのif- ステートメントと変数の割り当てになります。

関連情報