PDA

View Full Version : [BASH-SHELLSCRIPTING] dubbio banale


toni00t
30-06-2014, 11:06
ciao sto cercando di risolvere un esercizio di bash e mi sono reso conto di avere qualche dubbio sullo shell-Scripting e BASH che proprio non riesco a risolvere:

devo verificare che nei gruppi ci siano solo utenti omonimi
es : viero:x:1000:viero


#!/bin/bash
result=`cat /etc/group`
if[" cat $result | cut -f1 -d: = "cat $result | cut -f4 -d:"]
then
echo "OK"


, ma non funziona nulla e stampa un output vuoto .
Credo di non aver capito alcune cose :l'output di un comando come cat ,find o ls (e simili) quando effettuo la ridirezione dello stdout con la pipe è processato tutto in una volta (dopo che è finito di essere prodotto ) , o solo una riga alla volta ?

come posso in un caso come questo confrontare i campi di una stringa processata con cut tutto in un colpo ?

grazie

Daniels118
30-06-2014, 11:37
La condizione che hai scritto è sintatticamente errata (vi sono 3 doppia apici), inoltre per valutare le espressioni non vanno bene i doppi apici, devi utilizzare $() oppure i backquotes.
l'output di un comando come cat ,find o ls (e simili) quando effettuo la ridirezione dello stdout con la pipe è processato tutto in una volta (dopo che è finito di essere prodotto ) , o solo una riga alla volta ?
Non è importante come viene prodotto l'output, ma come viene elaborato l'input. La maggior parte dei comandi elabora l'input una riga per volta, ma vi sono anche comandi che raggruppano più o meno righe prima di elaborarle.
Tornando al tuo script vi è un altro problema di fondo: anche se i comandi processano ogni riga del file, l'operatore di confronto non viene applicato ad ogni riga.

toni00t
30-06-2014, 17:09
La condizione che hai scritto è sintatticamente errata (vi sono 3 doppia apici), inoltre per valutare le espressioni non vanno bene i doppi apici, devi utilizzare $() oppure i backquotes.

Non è importante come viene prodotto l'output, ma come viene elaborato l'input. La maggior parte dei comandi elabora l'input una riga per volta, ma vi sono anche comandi che raggruppano più o meno righe prima di elaborarle.
Tornando al tuo script vi è un altro problema di fondo: anche se i comandi processano ogni riga del file, l'operatore di confronto non viene applicato ad ogni riga.

ciao grazie della risposta : in che modo è possibile applicare il confronto riga per riga in questo caso? es viero:x:1000:viero , confrontare il campo 1 con il campo 4 ?

Daniels118
01-07-2014, 08:46
Puoi usare un ciclo per confrontare le righe una alla volta, così:
#!/bin/bash
while read line; do
u=$(echo $line | cut -f1 -d:)
g=$(echo $line | cut -f4 -d:)
if [ "$u" != "$g" ]; then
break
fi
done < /etc/group
if [ "$u" == "$g" ]; then
echo "OK"
else
echo "Errore"
fi
Oppure puoi utilizzare awk per estrarre le righe che non soddisfano i requisiti e poi le conti con wc:
#!/bin/bash
n=$(awk -F":" '{if($1!=$4){print $1","$4}}' /etc/group | wc -l)
if [ $n -eq 0 ]; then
echo "OK"
else
echo "Errore"
fi

vile83
04-07-2014, 11:13
ragazzi scusate mi intrometto un pò in modalità "cross topic", potreste linkarmi o mandarmi un messaggio pvt con un manuale di bash scripting fatto per bene?

Grazie e scusate ancora per la richiesta