Bourne Shell Scripting - semplice per la sintassi del ciclo
Domanda
Non sono del tutto nuovi alla programmazione, ma io non sono esattamente sperimentato. Voglio scrivere piccoli script di shell per la pratica.
Ecco quello che ho finora:
#!/bin/sh
name=$0
links=$3
owner=$4
if [ $# -ne 1 ]
then
echo "Usage: $0 <directory>"
exit 1
fi
if [ ! -e $1 ]
then
echo "$1 not found"
exit 1
elif [ -d $1 ]
then
echo "Name\t\tLinks\t\tOwner\t\tDate"
echo "$name\t$links\t$owner\t$date"
exit 0
fi
Fondamentalmente quello che sto cercando di fare è di avere lo script passare attraverso tutti i file in una directory specificata e quindi visualizzare il nome di ogni file con la quantità di link che ha, il suo proprietario, e la data di creazione . Quale sarebbe la sintassi per la visualizzazione della data di creazione o almeno la data dell'ultima modifica del file?
Un'altra cosa è, che cosa è la sintassi per la creazione di un ciclo for? Da quello che ho capito che avrei dovuto scrivere qualcosa di simile per $ 1 a $ 1 ($ 1 che tutti i file nella directory l'utente ha digitato nel giusto?) E poi passare attraverso la verifica ogni file e la visualizzazione delle informazioni per ciascuno di essi. Come faccio a iniziare e terminare il ciclo for (qual è la sintassi per questo?).
Come si può vedere che non sono molto familiare programmazione della shell Bourne. Se avete qualsiasi sito web utile o di avere un modo migliore di affrontare questo favore, mi mostri!
Soluzione
La sintassi per un ciclo for:
for var in list
do
echo $var
done
Ad esempio:
for var in *
do
echo $var
done
Che cosa si potrebbe prendere in considerazione però è qualcosa di simile a questo:
ls -l | while read perms links owner group size date1 date2 time filename
do
echo $filename
done
, che divide l'uscita di ls -l
in campi on-the-fly in modo non c'è bisogno di fare qualsiasi divisione da soli.
Il campo-splitting è controllata dai IFS conchiglia variabile, che per default contiene uno spazio, tab e newline. Se si modifica questo in uno script di shell, ricordarsi di cambiare di nuovo. Così cambiando il valore di IFS è possibile, ad esempio, analizzare i file CSV impostando questo per una virgola. questo esempio si legge tre campi da un file CSV e sputa fuori il 2 ° e 3 ° solo (è effettivamente l'equivalente shell di cut -d, -f2,3 inputfile.csv
)
oldifs=$IFS
IFS=","
while read field1 field2 field3
do
echo $field2 $field3
done < inputfile.csv
IFS=oldifs
(nota: non è necessità per ripristinare IFS, ma io in genere fare per fare in modo che l'ulteriore elaborazione del testo in uno script non è influenzata dopo ho finito con esso).
Un sacco di documentazione la su entrambi i loop for
e while
; solo google per esso: -)
Altri suggerimenti
Si potrebbe desiderare di guardare avanzata di scripting Bash . Ha una sezione che spiega cicli.
Suggerisco di usare find
con l'opzione -printf "%P\t%n\t%u\t%t"
$1
è il primo parametro posizionale, così $3
è il terzo e il quarto $4
è. Non hanno nulla a che fare con la directory (o le sue file) lo script è stato avviato da. Se lo script è stato avviato con questo, ad esempio:
./script.sh apple banana cherry date elderberry
allora la $1
variabile sarebbe uguale a "mela" e così via. Il parametro speciale $#
è il conteggio dei parametri posizionali, che in questo caso sarebbero cinque.
Il nome dello script è contenuto in $0
e $*
e $@
sono le matrici che contengono tutti i parametri posizionali che si comportano in modo diverso a seconda che compaiono tra virgolette.
È possibile fare riferimento ai parametri posizionali utilizzando un indice di sottostringa-style:
${@:2:1}
darebbe "banana" utilizzando l'esempio di cui sopra. E:
${@: -1}
o
${@:$#}
darebbe l'ultimo ( "sambuco"). Si noti che lo spazio prima del segno meno è necessario in questo contesto.
for x in "$@"; do
echo "$x"
done
Il "$ @" protegge gli spazi vuoti nei nomi di file in dotazione. Ovviamente, fare il vostro vero lavoro al posto di "$ x echo", che non sta facendo molto. Ma $ @ è tutte le cianfrusaglie in dotazione sulla riga di comando allo script.
Ma anche, lo script balle se $ # non è uguale a 1, ma a quanto pare il gioco è completamente in attesa fino a 4 argomenti (da qui $ 4 si fa riferimento nella prima parte dello script).
supponendo che avete GNU trovare sul vostro sistema
find /path -type f -printf "filename: %f | hardlinks: %n| owner: %u | time: %TH %Tb %TY\n"