[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Problem w skrypcie bash/sed/awk.



On Thu, Mar 12, 2009 at 07:05:38PM +0100, bartek szurgot wrote:
>>> #!/bin/bash
>>> cat /etc/passwd | \
>>>    while read line
>>>    do
>>>      C_USRNAME="`awk -F: '{print $1}' <<< "$line"`"
>>>      C_UID="`    awk -F: '{print $3}' <<< "$line"`"
>>>      C_HOMEDIR="`awk -F: '{print $6}' <<< "$line"`"
>>>      C_LSHELL="` awk -F: '{print $7}' <<< "$line"`"
>>>      C_COMMENT="`awk -F: '{print $5}' <<< "$line"`"
>>>      #C_PASSWORD=`egrep "^$C_USRNAME" /etc/shadow | cut -d: -f2`
>>>      echo useradd -u "$C_UID" -m -d "$C_HOMEDIR" -s "$C_SHELL" -c  
>>> "$C_COMMENT" -p "$C_PASSWORD" $C_USRNAME
>>>    done
>>> exit 0
>>
>> 1. Martwy kot. Właściwiej byłoby:
>> while read line; do
>> [...]
>> done < /etc/passwd
> mozna i tak.

Martwy kot jest niepotrzebnym mnożeniem procesów i dlatego jest "błędem
stylistycznym" ;->

>> 2. Jakoś wcześniej to zupełnie zignorowałem - bez sensu tu jeszcze awka
>> wrzucać. Trzeba po prostu IFS odpowiedni ustawić i dać readowi zrobić co
>> trzeba.
> tez na poczatq o tym myslalem - problem bedzie, jak pojawia Ci sie  
> spacje w linii (awk "zlapie" jak trzeba, ale read juz nie). napisz  
> dokladnie jakie Ty to widisz, bo moze nie myslimy o tym samym.

No jak awk nie złapie? Dlatego właśnie piszę o ustawieniu IFS.
~$ IFS=:
~$ head /etc/passwd | while read MY_LOGIN MY_PASS MY_UID MY_GID MY_COMMENT MY_HOME MY_SHELL; do echo $MY_LOGIN; done
root
daemon
bin
sys
sync
games
man
lp
mail
news

>> Źle stosuj'esz apostrof'y.
> ciesze sie, iz mimo wszystko udalo Ci sie rozczytac. ;)

Staram się ;->
A poważnie - to popularny ostatnio błąd.
Apostrofu używa się do tego:
http://so.pwn.pl/zasady.php?id=629619

-- 
[------------------------] The  page  just created is more than 18 feet
[  Kruk@epsilon.eu.org   ] tall or more than 18 feet wide, so I suspect
[ http://epsilon.eu.org/ ] something went wrong.(TeX)
[------------------------] 


Reply to: