사용자가 사용자 이름을 입력한 다음 성을 기준으로 시간에 따라 인사하는 간단한 bash 스크립트를 작성하려고 합니다. 나는 현재 다음을 가지고 있습니다 :
echo Please enter your username
read username
name=$(grep $username /etc/passwd | cut -d ':' -f 5)
h='date +%H'
if [ $h -lt 12]; then
echo Good morning ${name::-3)
기타 등등
이름 끝의 쉼표 3개를 가까스로 잘라냈는데, 이름도 잘라낼 수 있었으면 좋겠습니다.
예를 들어:
- 예
$name
.Amber Martin,,,
- 으로 줄였습니다
Amber Martin
. - 으로 더 줄여야 합니다
Martin
. - 이는 모든 이름에 대해 작동해야 합니다.
답변1
직접 읽는 것보다 사용하는 것이 getent passwd
더 좋습니다 /etc/passwd
. getent
LDAP, NIS 등과도 작동합니다. 나는 그것이 대부분의 유닉스 시스템에 존재한다고 생각합니다. (내 OS X에는 없지만 내 계정도 없으므로 /etc/passwd
...)
name=$(getent -- passwd "$USER" | cut -d: -f5)
문자열 처리는 쉘을 통해 수행 가능매개변수 확장, 이는 POSIX를 준수합니다.
name=${name%%,*} # remove anything after the first comma
name=${name%,,,} # or remove just a literal trailing ",,,"
name=${name##* } # remove from start until the last space
echo "hello $name"
${name#* }
첫 번째 공간까지 삭제를 사용하세요 . (그 사이에 공백이 있는 두 부분으로 된 성을 가진 사람이 없기를 바랍니다.)
분사나 콜론으로 설정하여 바꿀 수도 있습니다 cut
.read
IFS
답변2
#!/bin/bash
#And also /bin/sh looks like to be compatible in debian.
echo "Hmmm... Your username looks like to be $USER"
name="$(getent passwd $USER | cut -d: -f5 | cut -d, -f1)"
echo "Your full name is $name"
surname="$(echo $name | rev | cut -d' ' -f1 | rev)"
echo "Your surname is $surname"
echo "thank your for using only cut and rev to do that..."
echo "But i am sure there is a better way"
답변3
일단 가지고 있으면GECOS(설명) 필드cut
, 위치 및 전화번호 필드를 구분 기호로 제거(귀하의 경우 비어 있음)하려면 다른 작업을 수행하면 됩니다 ,
.
name=$(getent passwd "$USER" | cut -d: -f5 | cut -d, -f1)
echo "Hello, ${name##* }-san!"
연습으로 처리하겠습니다.모두 다른 가능성"성"이란 무엇입니까!