길이를 알 수 없는 경우 성에서 이름을 어떻게 제거할 수 있나요?

길이를 알 수 없는 경우 성에서 이름을 어떻게 제거할 수 있나요?

나는 사용자가 사용자 이름을 입력한 다음 시간에 따라 성으로 인사하는 간단한 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개를 잘라냈지만 이름도 잘라낼 수 있기를 원합니다.

예를 들어:

  • 이다 .$nameAmber 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!"

나는 그것을 다루는 연습으로 남겨 둘 것이다다양한 가능성"성"이란 무엇입니까!

관련 정보