Passa gli argomenti della riga di comando allo script bash


114

Sono nuovo di bash sulla programmazione degli script.

Voglio implementare uno script bash 'deploymLog', che accetta come input un argomento stringa (nome).

[root@localhost Desktop]# ./deploymLog.sh name

qui voglio passare l'argomento stringa (nome) attraverso la riga di comando

Come primo passo, devo aggiungere il timestamp corrente insieme a questa stringa di input a un file di registro Logone.txtnella directory corrente nel seguente formato:

[name]=[System time timestamp1]

Com'è possibile?

Risposte:


112
$> cat ./deploymLog.sh 
#!/bin/bash

name=$1
log_file="Logone.txt"

if [[ -n "$name" ]]; then
    echo "$1=$( date +%s )" >> ${log_file}
else
    echo "argument error"
fi

Il primo argomento da una riga comandi può essere trovato con il parametro posizionale $1. [[ -n "$name" ]]test per vedere se $namenon è vuoto. date +%srestituisce il timestamp corrente in tempo Unix. L' >>operatore viene utilizzato per scrivere su un file aggiungendo ai dati esistenti nel file.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

$> cat Logone.txt 
tt=1329810941
rr=1329810953

Per un timestamp più leggibile puoi giocare con gli dateargomenti.


7
principiante totale qui ... sarebbe utile sapere cosa [[ -n "$name" ]]sta facendo la parte.
MichaelChirico,

Sì, è vero, anch'io sono un totale noob e la mia sceneggiatura sta morendo su quella linea ???
pythonian29033,

4
"[[-N" $ name "]]" è un'altra forma del comando "test". Vedi: ss64.com/bash/test.html
jewettg

64

Gli argomenti della riga di comando di Shell sono accessibili tramite $1(il primo), $n(l'ennesimo) o $*(tutti gli argomenti), quindi lo script dovrebbe iniziare:

#!/bin/bash

if [ $# -ne 1 ]; then
    echo $0: usage: myscript name
    exit 1
fi

name=$1

Ora l'argomento name è accessibile dallo script come $name.

Per ottenere il timestamp usa il date(1)comando e assegnagli un identificatore di formato in modo che produca il formato desiderato:

now=$(date +%Y%m%d%H%M%S)

Ora $nowcontiene la data e l'ora correnti.

Quindi puoi creare il tuo file di registro in questo modo:

logfile=/path/to/log/file/mylogfile.$now
echo "[$name]=[$now]" >> $logfile

Stai meglio usando una funzione shell per registrare i tuoi messaggi in quanto sarà più facile da usare:

function logit
{
    now=$(date +%Y%m%d%H%M%S)
    echo "$now: $*" >> $logfile
}

Si noti che le funzioni della shell accedono ai propri argomenti allo stesso modo dello script (tramite $1ecc.)

Quindi lo script iniziale è simile al seguente:

#!/bin/bash

function logit
{
    now=$(date +%Y%m%d%H%M%S)
    echo "$now: $*" >> $logfile
}

if [ $# -ne 1 ]; then
    echo $0: usage: myscript name
    exit 1
fi

name=$1
now=$(date +%Y%m%d%H%M%S)
logfile=/path/to/log/file/mylogfile.$now

logit name = $name

(nota che il file di registro non è nel formato esatto specificato; è in uno migliore con il timestamp all'inizio di ogni riga).


7
#!/bin/bash

name=$1

echo "$(date '+%Y%m%d-%H:%M:%S') => " $name >> x.log

esegui "bash deploymLog.sh" e ottieni x.log con

20120220-23:53:50 =>  whatever

quando voti in basso, dai una ragione, grazie.

Suppongo che il downvoter abbia perso la ragione name=$1. La variabile $ name non viene mai utilizzata, poiché si genera letteralmente solo la stringa "name".
arte

oh mio male. grazie per la segnalazione. devo stare più attento.
Dyno Fu,

@DynoHongjunFu Tuttavia, la variabile ha lo stesso nome e valore, il che non è un buon modo per rendere leggibile l'esempio.
Volker Siegel,

È meglio citare il var quando si assegna un nome come questo:name="$1"
Jake
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.