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!

È stato utile?

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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top