[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
Progettare uno script che prenda un parametro sulla linea di comando
che indica il nome di un file; lo script crea un file il cui nome è
quello passato sulla linea comando e contenente l'elenco di tutte le directory
contenute nella directory corrente e il cui nome inizia "D" maiuscola.
Si controlli che il numero di parametri passati sulla linea di comando sia 1
# NOTA: il codice fornito provvede a creare i file necessari nella directory corrente.
# Suggerimento
# Si puo' usare il comando:
# cut -c1
# che scrive sul suo output il primo dei
# caratteri di ogni linea del suo input, per estrarre la prima
# lettera del nome di una directory.
#
#
# Esempio: il comando: ./cercaDir.sh elenco.txt
# potrebbe produrre come risultato un file elenco.txt contenente le seguenti
# linee:
#
# Dir1
# Dir3
#
# --- create test input files ---
#!/bin/bash
mkdir -p myfiles
mkdir -p Dir1
mkdir -p dir2
mkdir -p AltroNome
mkdir -p Dir3
echo Prova > Dir4.txt

Progettare uno script che prenda un parametro sulla linea di comando
che indica il nome di un file; lo script crea un file il cui nome è
quello passato sulla linea comando e contenente l'elenco di tutte le directory
contenute nella directory corrente e il cui nome inizia "D" maiuscola.
Si controlli che il numero di parametri passati sulla linea di comando sia 1
# NOTA: il codice fornito provvede a creare i file necessari nella directory corrente.
# Suggerimento
# Si puo' usare il comando:
# cut -c1
# che scrive sul suo output il primo dei
# caratteri di ogni linea del suo input, per estrarre la prima
# lettera del nome di una directory.
#
#
# Esempio: il comando: ./cercaDir.sh elenco.txt
# potrebbe produrre come risultato un file elenco.txt contenente le seguenti
# linee:
#
# Dir1
# Dir3
#
# --- create test input files ---
#!/bin/bash
mkdir -p myfiles
mkdir -p Dir1
mkdir -p dir2
mkdir -p AltroNome
mkdir -p Dir3
echo Prova > Dir4.txt
#!/bin/bash if[[ $# != 1 ]]; then echo "Devi passare solo un argomento, ovvero il nome della directory" exit 1 fi touch "$1" find . -name "D*" -type d -exec echo '{}' >> '$1' ';' exit 0
Risposte
Non hai bisogno del [tt]touch[/tt], [tt]echo ... >> ...[/tt] crea il file se non c'è. Se gli [tt]exit[/tt] non hanno una vera e propria ragione, puoi riarrangiare la cosa con if-then-else-fi. E poi, la ricerca delle directories che profondità deve avere? (Magari ricorsivamente?)
Ho aggiornato la traccia per sbaglio avevo omesso com'è sviluppata
Personalmente non so come risolverlo :/
#!/bin/bash if[[ $# != 1 ]]; then echo "Devi passare solo un argomento, ovvero il nome della directory" exit 1 fi if [[ -e "$#" ]]; then echo "Il file $# esiste!" else mkdir ./cercaDir.sh/elenco.txt fi fi find . -name "D*" -type d -exec echo '{}' >> '$1'';' exit 0
Il tuo primo tentativo va bene. Leggi i commenti nello script qui sotto.
Riguardo al tuo tentativo più recente, solo un appunto.
A parte il fatto che non so cosa pensi di farci, c'è un errore pesante. [inline]$#[/inline] è un intero, e penso che tu voglia chiederti dell'esistenza dell'unico argomento passato da linea d comando. In tal caso [inline][[ -f $1 ]][/inline].
#!/bin/bash # Uno e un solo argomento, altrimenti muori. if [[ $# != 1 ]]; then # Potresti voler trattare il messaggio come un errore, facendo così: # echo "..." > /dev/stderr echo ":: Devi passare solo un argomento!" exit 1 fi # Il comando echo appende le righe al file esistente, quindi potresti # volerlo eliminare prima di scriverci altro attraverso questo script. [[ -f $1 ]] && rm -rf $1 # Non me ne ero accorto. ATTENZIONE: tu avevi quotato $1 con # le virgolette singole (i.e. '$1'); invece usa le virgolette doppie # (oppure non metterle proprio), perché 1 deve essere espanso. find . -name "D*" -type d -exec echo '{}' >> $1 \; # Ad esemperimento puoi fare questa cosa: lascia pure le virgolette # singole; nella cartella attuale troverai un file di testo chiamato # proprio $1... # Ti serve questa cosa qui? Puoi non farlo, tanto alla fine se dai # echo $? # il terminale ti risponde 0. exit 0
Riguardo al tuo tentativo più recente, solo un appunto.
if [[ -e "$#" ]]; then echo "Il file $# esiste!" else mkdir ./cercaDir.sh/elenco.txt fi
A parte il fatto che non so cosa pensi di farci, c'è un errore pesante. [inline]$#[/inline] è un intero, e penso che tu voglia chiederti dell'esistenza dell'unico argomento passato da linea d comando. In tal caso [inline][[ -f $1 ]][/inline].
#!/bin/bash if[[ $# != 1 ]]; then echo "Devi passare solo un argomento, ovvero il nome della directory" exit 1 fi [[ -f $1 ]] && rm -rf $1 find . -name "D*" -type d -exec echo '{}' >> '$1'';' echo $?
"kaspar":
Il tuo primo tentativo va bene. Leggi i commenti nello script qui sotto.
#!/bin/bash # Uno e un solo argomento, altrimenti muori. if [[ $# != 1 ]]; then # Potresti voler trattare il messaggio come un errore, facendo così: # echo "..." > /dev/stderr echo ":: Devi passare solo un argomento!" exit 1 fi # Il comando echo appende le righe al file esistente, quindi potresti # volerlo eliminare prima di scriverci altro attraverso questo script. [[ -f $1 ]] && rm -rf $1 # Non me ne ero accorto. ATTENZIONE: tu avevi quotato $1 con # le virgolette singole (i.e. '$1'); invece usa le virgolette doppie # (oppure non metterle proprio), perché 1 deve essere espanso. find . -name "D*" -type d -exec echo '{}' >> $1 \; # Ad esemperimento puoi fare questa cosa: lascia pure le virgolette # singole; nella cartella attuale troverai un file di testo chiamato # proprio $1... # Ti serve questa cosa qui? Puoi non farlo, tanto alla fine se dai # echo $? # il terminale ti risponde 0. exit 0
Riguardo al tuo tentativo più recente, solo un appunto.
if [[ -e "$#" ]]; then echo "Il file $# esiste!" else mkdir ./cercaDir.sh/elenco.txt fi
A parte il fatto che non so cosa pensi di farci, c'è un errore pesante. [inline]$#[/inline] è un intero, e penso che tu voglia chiederti dell'esistenza dell'unico argomento passato da linea d comando. In tal caso [inline][[ -f $1 ]][/inline].
Grazie mille per avermi aiutato
