나는 사용자가 사용자 이름을 입력한 다음 시간에 따라 성으로 인사하는 간단한 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!"
나는 그것을 다루는 연습으로 남겨 둘 것이다다양한 가능성"성"이란 무엇입니까!