길이를 알 수 없는 경우 성에서 이름을 제거하는 방법은 무엇입니까?

길이를 알 수 없는 경우 성에서 이름을 제거하는 방법은 무엇입니까?

사용자가 사용자 이름을 입력한 다음 성을 기준으로 시간에 따라 인사하는 간단한 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. getentLDAP, 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.readIFS

답변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!"

연습으로 처리하겠습니다.모두 다른 가능성"성"이란 무엇입니까!

관련 정보