Re: Problem w skrypcie bash/sed/awk.
Mariusz Kruk wrote:
On Thu, 2009-03-12 at 10:21 +0100, bartek szurgot wrote:
pamietaj tez na przyszlosc, zeby przypisania do zmiennych i ich uzycie
zawsze brac w cudzyslowia - unikniesz dzieki temu sporej ilosc
"spacjowych problemow". :)
"Cudzysłowy"!!!
true, true...
#!/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.
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.
w/w skrypt jest dosc toporny, ale dziala (grepowanie shadow'a
wykomentowalem, bo nie testowalem tego - zostawilem jak bylo u Ciebie).
przed wykonaniem useradd dalem echo zebys widzial co sie dzieje (latwiej
bedzie Ci zmieniac/debugowac). jak skonczysz to wywalasz echo i voila. :)
Do debugowania dobre jest na początku skryptu 'shopt -s -o xtrace'
btw: petla "while read" bedzie miala tu jeszcze jedna zalete - zapewne
bedizesz potrzebowal odfiltrowac UID'y systemowe lub uzyszkodniqw juz
obecnych w docelowym systemie (i.e.: root, cron, etc...) - teraz
wystarczy dodac jednego if'a przed wykonaniem useradd'a.
Źle stosuj'esz apostrof'y.
ciesze sie, iz mimo wszystko udalo Ci sie rozczytac. ;)
--
pozdrawiam serdecznie / best regards,
bartek szurgot
http://baszerr.org
Reply to: