[Sistemi Operativi] Script Shell
Salve a tutti. Ho alcune perplessità riguardante questo esercizio. Non sono sicuro di averlo svolto correttamente. Se qualcuno sarebbe così gentile di visionarlo. Grazie mille 
Questo è il codice scritto da me

# Realizzare uno script per la shell bash (completando il codice fornito # nella traccia) che prende come parametri sulla linea di comando il nome di # una directory e una stringa. # Lo script deve controllare che ci siano esattamente due parametri # sulla linea di comando, e che il primo sia il nome di una directory; # in caso contrario,lo script deve scrivere un messaggio di errore e terminare # immediatamente la sua esecuzione. # Altrimenti, lo script deve trovare nella directory indicata come # primo parametro tutti i file il cui nome termina con ".txt", e # per ciascun file deve stampare un messaggio che indica se il file # contiene o non contiene la stringa passata come secondo parametro. # Infine, lo script deve stampare il numero di file trovati che # contengono la stringa. # # SUGGERIMENTI # - il comando # grep --quiet stringa nomefile # può essere usato per verificare se un file contiene una certa stringa; # se la stringa è presente, l'exit status è 0, altrimenti l'exit status # è diverso da 0. # NOTA: il codice fornito provvede a creare alcuni file # nella directory myfiles, in modo da poter testare lo script. # # Esempio: # lanciando lo script con il comando: # ./main.sh myfiles ESAME # lo script deve produrre come output: # Il file myfiles/file2.txt contiene la stringa ESAME # Il file myfiles/file3.txt contiene la stringa ESAME # Il file myfiles/file4.txt NON contiene la stringa ESAME # Trovati 2 files contenenti la stringa ESAME # # Esempio: # lanciando lo script con il comando: # ./main.sh myfiles ALTRE # lo script deve produrre come output: # Il file myfiles/file2.txt NON contiene la stringa ALTRE # Il file myfiles/file3.txt NON contiene la stringa ALTRE # Il file myfiles/file4.txt contiene la stringa ALTRE # Trovati 1 files contenenti la stringa ALTRE # # --- le seguenti istruzioni creano i file per il test nella --- # --- directory 'myfiles'--- #! /bin/bash mkdir myfiles cat > myfiles/file1.dat << EOF 0 12 ESAME 12 0 2 1 EOF cat > myfiles/file2.txt << EOF 0 12 ESAME 33 2 1 EOF cat > myfiles/file3.txt << EOF 22 ESAME 12 0 2 1 EOF cat > myfiles/file4.txt << EOF 22 ALTRE PAROLE 12 0 2 1 EOF
Questo è il codice scritto da me
if[[ "$#" != 2 ]]; then echo "Devi passare solo due argomenti, ovvero il nome della directory e la stringa" exit 1 fi if [[ -d "$1"]]; then echo "Errore verificato non è una directory" exit 1 fi for myfiles in $1/*; do find . -iname '*.txt' -type f -exec echo '{}' >> '$1'';' for myfiles in $(ls *.txt); do grep --quiet done done exit 0
Risposte
Vorrai dire "[inline]if [[ ! -d $1 ]]; ...[/inline]", forse...
Il find a cosa ti serve, non lo usi. E poi, attenzione a che virgolette usi con $1 nel find. Te lo avevo spiegato qualche discussione fa.
Se vuoi ciclare sui file ".txt" puoi fare così:
per evitare
L'altro loop a cosa ti serve? [Spoiler: oltre a non avere senso, a niente.]
Usi male il grep: rileggi il suggerimento che ti è stato dato.
Ricorda che per richiamare l'exit status del comando più recente c'è $?. Usalo.
Il find a cosa ti serve, non lo usi. E poi, attenzione a che virgolette usi con $1 nel find. Te lo avevo spiegato qualche discussione fa.
Se vuoi ciclare sui file ".txt" puoi fare così:
for f in $1/*.txt; ...
per evitare
for myfiles in $(ls *.txt); ...
L'altro loop a cosa ti serve? [Spoiler: oltre a non avere senso, a niente.]
Usi male il grep: rileggi il suggerimento che ti è stato dato.
Ricorda che per richiamare l'exit status del comando più recente c'è $?. Usalo.
if[[ "$#" != 2 ]]; then echo "Devi passare solo due argomenti, ovvero il nome della directory e la stringa" exit 1 fi if [[ ! -d "$1"]]; then echo "Errore verificato non è una directory" exit 1 fi for f in $1/*.txt; do if [[ grep --q f '*.txt' ]] then echo "IL file contiene la stringa" else "Il file non contiene la stringa" fi done exit $?
Ciao. Intendevo una cosa così.
# ... for f in $1/*.txt; do # grep fa cose, "--quiet" lo silenzia. # Quando finisce, emette un exit status # che viene catturato da ?. grep --quiet "$2" "$f" if [[ $? == 0 ]] then # ... else # ... fi done
Capito. grazie mille