скрипт bash и greping с командной строкой - PullRequest
2 голосов
/ 16 января 2012

плохо знакомы с bash-скриптингом, поэтому просто интересно, правильно ли я делаю этот код.я пытаюсь найти / etc / passwd и затем grep и распечатать пользователей.

usage ()
{
     echo      "usage: ./file.sk user"
}
# test if we have two arguments on the command line
if [ $# != 1 ]
then
    usage
    exit
fi

if [[ $# < 0 ]];then
   usage
   exit
fi

# Search for user
fullname=`grep $1 /etc/passwd | cut -f 5 -d :`
firstname=`grep $1 /etc/passwd | cut -f 5 -d : | cut -f 1 -d " "`

#check if there. if name is founf: print msg and line entry
not sure as how to this or if im doing this right...

я делаю это правильно?

Ответы [ 5 ]

3 голосов
/ 16 января 2012
grep $1 /etc/passwd | while IFS=: read -r username passwd uid gid info home shell
do
  echo $username: $info
done
2 голосов
/ 16 января 2012

Это может работать для вас:

fullname=$(awk -F: '/'$1'/{print $5}' /etc/passwd)
firstname=${fullname/ *}
1 голос
/ 16 января 2012

Вы на правильном пути.

Но я думаю, что 2-й if [[ $# < 0 ]] .... fi блок вас мало что даст. Ваш первый тестовый пример правильно определяет ситуацию: «Для этого сценария требуется 1 аргумент или выход».

Кроме того, я не вижу, для чего вам нужно имя, поэтому базовый тест -

 case "${fullname:--1}" in 
   -[1] ) printf "No userID found for input=$1\n" ; exit 1 ;;
   * )
     # assume it is OK
     # do what every you want after this case block
   ;;
 esac

Вы можете, конечно, продублировать это с помощью "${firstname}", если вам действительно нужен чек.

ИЛИ как эквивалент, если ... fi равно

 if [[ "${fullname}" == "" ]] ; then
    printf "No userID found for input=$1\n" ; exit 1
 fi

обратите внимание, чтобы быть более эффективным, вы можете разобрать $ {fullname}, чтобы получить имя без всех вызовов grep и т. Д., Т.е.

 firstname=${fullname%% *}

Дайте мне знать, если вам нужно, чтобы я объяснил: - 1} и %% *} модификаторы переменных.

Надеюсь, это поможет.

1 голос
/ 16 января 2012

Вместо этого:

fullname=`grep $1 /etc/passwd | cut -f 5 -d :`
firstname=`grep $1 /etc/passwd | cut -f 5 -d : | cut -f 1 -d " "`

Попробуйте это:

fullname=$(cut -f5 -d: /etc/passwd | grep "$1")

if [[ $? -ne 0 ]]; then
    # not found, do something
fi

firstname=${fullname%% *} # remove the space and everything after

Обратите внимание, что я изменил свой ответ, чтобы сократить до grep, чтобы он не получал ложных срабатываний, если некоторые другиеполе соответствует полному имени, которое вы ищете.

0 голосов
/ 17 января 2012

Вы можете просто прочитать ваш ввод в array, а затем распечатать нужные поля, что-то вроде этого -

grep $1 /etc/passwd | while IFS=: read -a arry; do 
    echo ${arry[0]}:${arry[4]}; 
done

Тест:

jaypal:~/Temp] echo "root:*:0:0:System Administrator:/var/root:/bin/sh" | 
while IFS=: read -a arry; do 
    echo ${arry[0]}:${arry[4]}; 
done
root:System Administrator
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...