[Sistemi Operativi] Script Shell

giacomovicinanza
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 :)

# 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
kaspar1
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ì:
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.

giacomovicinanza
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 $?

kaspar1
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

giacomovicinanza
Capito. grazie mille

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.