Home Page

Tips page
c
cellulari
debian
egittologia
emacs
emacs-latex
hardware
html
inglese
java
latex
linux

*Alcuni comandi utili utilizzando find
*ARP e MAC address
*Ascoltare un CD audio
*Attivare il NumLock (BlocNum)
*Attivare i tasti i tasti Magic SysRq
*AWK, use an environment variable inside a script
*Bash e Argument list too long
*BogoMIPS
*Cancellare file e non recuperare spazio
*Capacita` dell'hard disk
*Come cambiare i font delle applicazioni con librerie GTK
*Come cambiare l'hostname
*Come tentare di recuperare file, filesystem e partizioni
*Compilare in parallelo
*Condividere una partizione
*Configure proxy for shells
*Continuous disk access
*Controllare la salute di hard disk e filesystem
*Convertire ext2 in ext3 (e viceversa)
*Convertire un file di testo dalla codifica DOS a quella UNIX
*Cosa fare quando si perde la password di root
*Cosa significa l'errore ``TCP
*Creare un boot floppy
*Creare un file temporaneo
*Deframmentazione di un filesystem
*Delete last chars from a string
*Determinare lo spazio libero sul disco
*Eliminare il beep
*Emettere un beep da script
*Enable PPP connection on boot
*Exclude a directory with rsync
*Execute telnet from a script
*Gestione dei file di log
*Gestione dei file .iso
*Gestione della data/ora
*Gestione di utenti e gruppi
*Hash md5 di una stringa
*Identificare la distribuzione installata
*I file ps e pdf
*Il file /etc/fstab
*Il file /etc/issue[.net] e /etc/motd
*Il filesystem SysFs
*I link soft ed hard
*Il path delle applicazioni
*Il sistema tutto in maiuscolo
*I moduli del kernel
*Impostare piu` IP per una scheda di rete
*Introduzione a LVM
*Inviare messaggi agli altri utenti
*I permessi della directory root, /
*La gerarchia del filesystem di Linux
*La memoria Ram sotto Linux
*La memoria swap
*Limitare la possibilita` di diventare root
*Limitazioni alla dimensione del file
*Log dei login utente
*Modificare il comportamento di ctrl+alt+canc
*Modificare le variabili della parent shell
*Montare o rimontare un filesystem come read-only
*More columns in a shell output
*Negare il login durante la manutenzione del sistema
*NoHUP
*Obtain the exact process start time
*Ottenere uno snapshot dello schermo
*Partizionamento di un sistema Linux
*Perche' si usa ./ per avviare alcuni eseguibili
*Permanent PPP connection
*PID of a process
*Programmare l'esecuzione dei programmi
*Quale processo utilizza un certo file o porta
*Quali vantaggi si hanno dalla ricompilazione
*Remove from find results
*Ricreare velocemente /tmp al boot
*Ridirezione dell'output
*Rimappare la tastiera
*Ripristinare i caratteri sballati in console
*Riscrivere l'MBR
*Salvarsi da un ``rm'' di troppo...
*Save MBR
*Scrivere in modo sincrono su filesystem
*Scrivere nel log di sistema di Linux
*Separazione dei comandi nella shell
*Separazione delle parole nella shell
*Share the internet connection
*Shell configuration files
*Single quote character escape with sed
*Spostare una directory in un'altra partizione
*Stimare il carico di lavoro della macchina
*Undelete di un file
*Usare le pendrive USB sotto Linux
*Usare partizioni primarie o estese
*Use md5sum to verify saved files
*Use ssh and scp without password
*Utilizzare hdparm per controllare gli hard disk
*Verificare un file video
*What is a zombie process
*What is the file System.map?
*What is the shebang? (Shell scripts)
*What shared libraries a program uses
*Yesterday date

matlab
misc
mysql
network
octave
programming
python
security
sed
tech
webapps
windows

University Page

Programming

Debian & Linux

Some works

About me

Del.icio.us Bookmarks

BOINC Combined Statistics

Site Statistics

Contact me sending an e-mail (antispam defense activated)

debian

hacker emblem

blogger

GeoURL

View Sandro Tosi's profile on LinkedIn

This is my Google PageRank

Title: Separazione delle parole nella shell
Author: Sandro Tosi
Last modified: 2007-09-01

Cerchiamo di  capire come  bash separi le  parole tra loro;  questo ci
tornera` utile soprattutto in fase di scrittura di shell script.

La shell esamina il contenuto di espansioni di parametri, sostituzione
di comandi,  ed espansioni aritmetiche  non racchiusi tra  doppi apici
per la separazione in parole.

Bash utilizza  ogni carattere contenuto nella  variabile IFS (Internal
Field  Separator)  come  delimitatore,  e separa  il  risultato  delle
espansioni precedenti in parole usando quei caratteri.

Il  valore  di  default  e`  ``<space><tab><newline>'';  e`  possibile
specificare   altri  valori   per  IFS,   valorizzando   la  variabile
opportunamente. Se IFS e` nulla  (IFS="" o IFS=''), non avviene alcuna
separazione in parole.

Si faccia attenzione a cambiare  IFS in quanto questo potrebbe portare
a  diversi effetti  collaterali;  in ogni  caso,  per ripristinare  il
valore di default si puo` eseguire:

IFS=' \t\n'

Ecco un esempio che puo` aiutare a comprendere l'utilizzo di IFS:

$ a=w:x:y:z
$ cat $a
cat: w:x:y:z: No such file or directory
$ IFS=":"
$ cat $a
cat: w: No such file or directory
cat: x: No such file or directory
cat: y: No such file or directory
cat: z: No such file or directory

Nella prima esecuzione di `cat',  la shell espande la variabile "a" ed
interpreta la stringa "w:x:y:z" come  una singola parola e cosi` viene
passata come argomento a `cat'. Dopo, quando IFS e` valorizzata a ":",
l'espansione di  $a fa si` che  la shell separi la  stringa in quattro
parole, ed ognuna di esse diventi parametro di `cat'.

Questo  meccanismo  funziona solo  se  c'e`  espansione:  se non  c'e`
espansione, allora non c'e` nemmeno separazione in parole.

Se IFS non e` settata, solo i caratteri "spazio" e "tab" funzioneranno
da separatori.

Un esempio tipico in cui si ha necessita` di cambiare il valore di IFS
e` quando si vuole lavorare "per righe":

$ cat test.txt
prima linea del file
seconda linea del file

$ for token in $(cat test.txt); do echo $token ; done

$(cat test.txt) viene  espanso in "prima linea del  file seconda linea
del file" (in quanto l'espansione  elimina i ritorni a capo), e questa
stringa verra` spezzata per il separatore IFS (di default impostato al
carattere spazio) e quindi il ciclo stampera` una parola alla volta.

Se  invece  si  ha  necessita`  di  lavorare  riga-per-riga,  si  deve
impostare IFS in uno dei seguenti modi:

IFS=$'\n'

oppure

IFS='<premere return..>
'

Il ciclo precedente, a questo punto, stampera` una linea alla volta.