Settare il valore di IFS

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
napoleone1981
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: gio 26 ago 2004, 0:00
Località: Sant'Elena

Settare il valore di IFS

Messaggio da napoleone1981 »

Ciao,
per uno script in bash devo modificare il valore della variabile d'ambinete IFS. Di edfault è <space><tab><newline>, mentre io vorrei togliere lo <space> (in modo che in un ciclo for i nomi dei file con gli spazi non me li faccia diventare più file).... Come cavolo si fa???
Ho provato con:

Codice: Seleziona tutto

IFS="\t\n";
IFS=\t\n;
IFS='\t\n';
IFS=$\t$\n;
IFS=<tab><newline>
Ma nulla!!!!!!!!!!!
Aiuto!!!

Avatar utente
MAT
Linux 4.x
Linux 4.x
Messaggi: 1242
Iscritto il: mer 9 mar 2005, 0:00
Nome Cognome: Matteo Magni
Kernel: 2.6.20
Desktop: Fluxbox
Distribuzione: Gentoo
Località: Vignola, Modena

Messaggio da MAT »

Usa export. I nomi dei file con spazi comunque li puoi trattare benissimo se racchiudi il nome fra virgolette. Ad esempio

Codice: Seleziona tutto

for i in *
do
if [ -r "$i" ]; then
echo "$i is readable"
fi
done
O forse non era questo che intendevi?

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3974
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »

prova con

Codice: Seleziona tutto

 IFS=$'\t\n' 
comunque IMHO è meglio la soluzione di MAT

Avatar utente
napoleone1981
Linux 2.x
Linux 2.x
Messaggi: 380
Iscritto il: gio 26 ago 2004, 0:00
Località: Sant'Elena

Messaggio da napoleone1981 »

Il punto è che io con find mi vado a cercare tutti i file all'interno di una directory (e delle sottosirectory... quindi in * non andrebbe bene...). Dopodichè li metto tutti in un file (per comodità) e poi faccio il bel for i in `cat ...`
Quindi credo che la soluzione di paoletta (se funziona, ora provo) sia più adatta...
Grazie

Avatar utente
gallows
Staff
Staff
Messaggi: 3466
Iscritto il: lun 20 set 2004, 0:00
Slackware: -current
Località: Palermo

Messaggio da gallows »

Perché invece del ciclo for non usi:

Codice: Seleziona tutto

$ find $sorgente -name "*.jpg" -exec cp {} $destinazione \;
?

ps. $sorgente e $destinazione sono le directory,

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6566
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Messaggio da targzeta »

La soluzione è il comando interno echo. Anche io mi diverto a volte a modificare questa variabile.

IFS=$(echo -e "\t\n")

l'opzione -e di echo ti permette di inserire i caratterni non stampabili.

Oppure pui fare anche:

IFS=${IFS# }

Nota lo spazio dopo il #. Leggi il paragrafo "Parameter Expansion" della bash.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6566
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Errata Corrige

Messaggio da targzeta »

Riciao,
la prima soluzione è sbagliata, non è

IFS=$(echo -e "\t\n")

ma

IFS=$(echo -e "\n\t")

con la prima soluzione IFS viene settata solo a "\t". Perchè? La risposta è
nel paragrafo Command Substitution di bash, più precisamente:
" Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted."
Ovvero, durante la sostituzione del comando con il suo standard output, i
newline finali vengono cancellati.

Rispondi