実際のユーザー名が引数として使用されているときにユーザーのホームディレクトリパスを表示し、そのシステムに存在しないユーザー名が引数として使用されているときにユーザーが見つからないか何かを表示する単純なBashスクリプトを作成したいと思います。
この機能が必要ですか?スクリプトファイルでデフォルトのGNU互換コマンドを使用してこれを実行できますか?
答え1
read -p "Enter a username: " username
if getent passwd "$username" > /dev/null
then
printf "Their home directory is: %s\n" "$(getent passwd "$username" | cut -d: -f6)"
else
printf "User not found!\n" >&2
fi
答え2
#!/bin/sh
username=$1
if ! getent passwd "$username" >/dev/null 2>&1; then
printf 'User %s does not exist\n' "$username"
exit 1
fi
homedir=$( getent passwd "$username" | cut -d: -f6 )
if [ -n "$homedir" ]; then
if [ -d "$homedir" ]; then
printf 'User %s has a valid (existing) home directory: %s\n' "$username" "$homedir"
else
printf 'User %s lacks a valid (existing) home directory: %s\n' "$username" "$homedir"
fi
else
printf 'User %s has no home directory\n' "$username"
fi
このスクリプトはコマンドラインからユーザー名を取得します。
$ ./script.sh kk
User kk has a valid (existing) home directory: /home/kk
$ ./script.sh nobody
User nobody lacks a valid (existing) home directory: /nonexistent
$ ./script.sh aoae
User aoae does not exist
答え3
getent passwd <USERNAME>
ユーザーデータベースを読むのに最適な方法です。ユーザーが存在する場合はそのユーザーのユーザーデータベースのエントリを印刷し、ユーザーが存在しない場合はゼロ以外の値で終了します。
したがって、出力がゼロで終了することを確認し、ゼロ以外の値で終了した場合は、エラーメッセージを印刷できます。
ホームディレクトリはpasswdエントリの6番目のフィールドです。などの標準テキスト処理ツールを使用してawk
抽出できますcut
。
if passwd="$(getent passwd "$user")"; then
awk -F: '{print $6}' <<<"$passwd"
else
echo "No such user $user" >&2
fi