Un tema che non è molto conosciuto da molte persone che usano la bash su Linux è l’uso dei parametri speciali che sono disponibili in bash.
Questi parametri possono essere utilizzati solo come riferimento in quanto l’attribuzione ad esse non è permesso, sto parlando di parametri come $$ o $?.
Vediamo qualche esempio con essi.
$?
Si espande con lo stato di uscita del comando in foreground più recentemente eseguito. Utilizzando questo si può controllare se il vostro script bash viene completato con successo o meno, di solito un exit status 0 significa che il comando ha terminato senza errori, mentre un numero indica un errore specifico.
Esempio semplice, creare un file e fare un ls di esso, queste operazioni hanno successo quindi il codice di uscita è 0, mentre un ls di un file non esistente da come codice di uscita 2:
(%:/tmp)┌- touch myfile (%:/tmp)┌- echo $? 0 (%:/tmp)┌- ls myfile myfile (%:/tmp)┌- echo $? 0 (%:/tmp)┌- ls not-myfile ls: cannot access not-myfile: No such file or directory (%:/tmp)┌- echo $? 2 |
Colora parte del vostro prompt di rosso per indicare un errore.
Se il codice restituito dal comando è superiore a zero, colora di rosso parte del vostro prompt. I comandi danno un prompt come questo:
[user current_directory]$
Dopo un errore, la parte “user [” viene automaticamente colorata di rosso.
Testato con bash su xterm e terminal. va messo nella vostra .bashrc o .bash_profile.
export PROMPT_COMMAND='if (($? > 0)); then echo -ne "\033[1;31m"; fi'; export PS1='[\[\]\u\[\033[0m\] \[\033[1;34m\]\w\[\033[0m\]]\$ ' |
Cracking di un file .rar protetto da password in una linea, con il metodo di attacco dizionario. Tutto ciò che serve è un buon dizionario (dict.txt).
Fondamentalmente si tratta di un ciclo fino a quando lo stato di uscita è uguale a 0
for i in $(cat dict.txt);do unrar e -p$i protected.rar; if [ $? = 0 ];then echo "Passwd Found: $i";break;fi;done |
$$
Si espande nel ID del processo della shell. In una subshell (), si espande per l’ID di processo della shell di invocazione, non la subshell.
Mostra il PID di una sessione in un terminale:
(%:/tmp)┌- echo $$ 3177 (%:/tmp)┌- ps -ef |grep 3177 linuxaria 3177 3124 0 12:29 pts/2 00:00:00 zsh linuxaria 6714 3177 0 22:39 pts/2 00:00:00 ps -ef linuxaria 6715 3177 0 22:39 pts/2 00:00:00 grep 3177 |
uscire senza salvare la storia dei comandi dati.
questo fa uscire dalla bash senza salvare la storia. a differenza del disabilitare esplicitamente la storia, questo funziona in ogni parte, e funziona se si decide *dopo* aver dato il comando che non si voleva dare che non si vuole essere registrati.
kill -9 $$ |
Capire che shell si sta utilizzando
readlink -f /proc/$$/exe |
$#
Si espande per il numero di parametri posizionali con un numero decimale.
Questo è in genere utilizzato per verificare all’inizio di uno script bash se l’utente ha digitato il numero corretto di argomenti, per verificare che ne abbia messi tre:
#!/bin/bash if [ $# -lt 3 ] then echo "Usage: $0 arg1 arg2 arg3" exit 3 fi |
In questo esempio ho usato anche il parametro speciale $0 che è espanso con il nome dello script di shell o shell.
$@ e $*
$* Si espande nei parametri posizionali, a partire da uno. Quando l’espansione avviene tra virgolette, si espande a una singola parola con il valore di ogni parametro separato dal primo carattere della variabile speciale IFS. Cioè, “$ *” equivale a $1c$2c…, dove c è il primo carattere del valore della variabile IFS. Se IFS è non impostato, i parametri sono separati da spazi. Se IFS è nullo, i parametri sono uniti senza separatori.
$@ Espande nei parametri posizionali, a partire da uno. Quando l’espansione avviene tra virgolette, ogni parametro si espande in una parola separata. Cioè, “$@” equivale a “$1” “$2” …. Quando non ci sono parametri di posizione, “$@” e $@ si espandono in nulla (cioè, sono rimossi).
Come Panoramica:
Sintassi | Risultato effettivo |
---|---|
$* |
$1 $2 $3 ... ${N} |
$@ |
$1 $2 $3 ... ${N} |
"$*" |
"$1c$2c$3c...c${N}" |
"$@" |
"$1" "$2" "$3" ... "${N}" |
Si vede che, senza essere quotato (doppi apici), entrambi hanno lo stesso effetto: tutti i parametri posizionali utilizzati da $1 a l’ultimo sono espansi senza speciali.
Quando il parametro speciale $*
è quotato, si espande con l’equivalente di: "$1c$2c$3c$4c........$N"
, doce ‘c’ è il primo carattere di IFS
.
Ma quando il parametro speciale $@
è quotatos, si espande con l’equivalente di…
"$1" "$2" "$3" "$4" ..... "$N"
…che rispecchia esattamente tutti i parametri posizionali come se fossero inizialmente dati allo script o la funzione. Se si vuole riutilizzare i parametri posizionali a chiamare un altro programma (ad esempio in un wrapper-script), allora questa è la scelta per voi, usate il doublequoted "$@"
.
Bash che stampa le informazioni sugli argomenti dati nella riga di comando:
#!/bin/sh echo "I was called with $# parameters" echo "My name is $0" echo "My first parameter is $1" echo "My second parameter is $2" echo "All parameters are $@" |
Questi sono i parametri speciali più comuni utilizzati in bash, ce ne sono alcuni altri che è possibile controllare in questi siti:
Bash reference manual
The Geek stuff
Popular Posts:
- None Found