Stringhe
La shell Bash ha avuto una lunga storia e molte aggiunte
- Per la compatibilità con la shell di Bourne
- Per aggiungere nuove funzionalità
- Per interagire con comandi esterni come expr
- Come risultato è un miscuglio di sintassi
- Qualche volta sembra inconsistente
- Vi sono spesso più modi per ottenere un risultato
Esempio tipico è la gestione stringhe
Lunghezza di una stringa:
str=abcdefghijklmnopqrstuvwxyz
echo ${#str}
echo $(expr length $str)
Sottostringa:
echo ${str:10}
echo ${str:10:4}
echo ${str: -4}
NB: ci vuole uno spazio prima del meno
Anche:
echo $(expr substr $str 5 6)
Indice di una sottostringa:
echo $(expr index $str 'lmn')
Rimozione sottostringhe
Data la stringa:
st=abcABC123ABCabc
Rimozione corta iniziale:
echo ${st#a*C}
Rimozione lunga iniziale:
echo ${st##a*C}
Rimozione corta finale:
echo ${st%A*c}
Rimozione lunga finale:
echo ${st%%A*c}
Sostituzione sottostringhe
Sostituzione della prima occorrenza:
echo ${st/abc/xyz}
Sostituzione di ogni occorrenza:
echo ${st//abc/xyz}
Sostituzione condizionale iniziale:
${st/#abc/XYZ}
Sostituzione condizionale finale:
${st/%abc/XYZ}
Sostituzione parametrica
Se la variabile non è settata, usa il default:
${variabile-default}
La variabile però rimane non settata
- Usato soprattutto per gli argomenti della linea di comando
Se la variabile non è settata o è la stringa vuota, usa il default:
${variabile:-default}
Se la variabile non è settata, settala al default:
${variabile=default}
Se la variabile è settata usa l'alternativa:
${variabile+alternativa}
Se la variabile non è settata, esci col messaggio d'errore:
${variabile?"messaggio"}
Esempio.
(param1.sh)
#! /bin/bash
var1=
echo ">>${var1-pippo}<<"
echo ">>${var1:-pippo}<<"
echo ">>${var2-pippo}<<"
echo ">>${var2:-pippo}<<"
echo ">>$var1<<"
echo ">>$var2<<"
Che dà:
./param1.sh
>><<
>>pippo<<
>>pippo<<
>>pippo<<
>><<
>><<
Altro esempio.
(param1a.sh)
#! /bin/bash
echo -n "Ciao, come ti chiami? "
read nome
echo "Benvenuto, ${nome:-ciccio}"
Esempi d'uso:
./param1a.sh
Ciao, come ti chiami? alfio
Benvenuto, alfio
./param1a.sh
Ciao, come ti chiami?
Benvenuto, ciccio
Esempio.
(param1b.sh)
#! /bin/bash
file=${1:-/etc/passwd}
[ -e $file ] && ex="esiste" || ex="non esiste"
echo $file $ex
Uso:
./param1b.sh
/etc/passwd esiste
./param1b.sh zot
zot non esiste
Esempio.
(param2.sh)
#! /bin/bash
var1=
echo ">>${var1=pippo}<<"
echo ">>${var1:=pluto}<<"
echo ">>${var2=paperino}<<"
echo ">>${var2:=minnie}<<"
echo ">>$var1<<"
echo ">>$var2<<"
Uso:
./param2.sh
>><<
>>pluto<<
>>paperino<<
>>paperino<<
>>pluto<<
>>paperino<<
Esempio.
(param3.sh)
#! /bin/bash
var1=
var2=topolino
echo ">>${var1+pippo}<<"
echo ">>${var1:+pluto}<<"
echo ">>${var2+paperino}<<"
echo ">>${var2:+minnie}<<"
echo ">>$var1<<"
echo ">>$var2<<"
Uso:
./param3.sh
>>pippo<<
>><<
>>paperino<<
>>minnie<<
>><<
>>topolino<<
Esempio.
(param4.sh)
#! /bin/bash
: ${HOSTNAME?} ${USER?} ${HOME?} ${MAIL:="non settata"}
echo "Parametri d'ambiente principali settati"
echo "Sei l'utente $USER"
echo "Sul computer $HOSTNAME"
echo "La tua Home Directory e' $HOME"
echo "La tua casella di posta e' $MAIL"
Il comando :
è il comando nullo, e qui è usato solo come 'trucco' per settare le variabili a seguire.
Uso:
./param4.sh
Parametri d'ambiente principali settati
Sei l'utente michele
Sul computer thorin
La tua Home Directory e' /home/michele
La tua casella di posta e' non settata
echo ">>$MAIL<<"
>><<