Übergeben Sie Befehlszeilenargumente an das Bash-Skript

114

Ich bin neu in der Programmierung von Bash-Skripten.

Ich möchte ein Bash-Skript 'deploymLog' implementieren, das als Eingabe ein String-Argument (Name) akzeptiert.

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

Hier möchte ich das Zeichenfolgenargument (Name) über die Befehlszeile übergeben

Als ersten Schritt muss ich den aktuellen Zeitstempel zusammen mit dieser Eingabezeichenfolge an eine Protokolldatei anhängen, z. B. Logone.txtim aktuellen Verzeichnis im folgenden Format:

[name]=[System time timestamp1]

Wie ist das möglich?

l0b0
quelle

Antworten:

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

Das erste Argument aus einer Befehlszeile kann mit dem positional-Parameter gefunden werden $1. [[ -n "$name" ]]prüft, ob $namenicht leer ist. date +%sGibt den aktuellen Zeitstempel in Unix-Zeit zurück. Der >>Operator wird zum Schreiben in eine Datei verwendet, indem an die vorhandenen Daten in der Datei angefügt wird.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

Für einen besser lesbaren Zeitstempel könnten Sie mit dateArgumenten spielen.

ДМИТРИЙ МАЛИКОВ
quelle
7
total anfänger hier ... es wäre hilfreich zu wissen was der [[ -n "$name" ]]teil macht.
MichaelChirico
Ja, das stimmt, ich bin auch total noob und mein Drehbuch stirbt in dieser Zeile ???
Pythonian29033
4
Das "[[-n" $ name "]]" ist eine andere Form des Befehls "test". Siehe: ss64.com/bash/test.html
jewettg
64

Auf Shell-Befehlszeilenargumente kann über $1(das erste), $n(das n-te) oder $*(alle Argumente) zugegriffen werden. Daher sollte Ihr Skript gestartet werden:

#!/bin/bash

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

name=$1

Jetzt ist das Argument name über das Skript als zugänglich $name.

Verwenden Sie zum Abrufen des Zeitstempels den date(1)Befehl und geben Sie ihm einen Formatbezeichner, damit das gewünschte Format erstellt wird:

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

$nowEnthält jetzt das aktuelle Datum und die Uhrzeit.

So können Sie Ihre Protokolldatei erstellen:

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

Sie sollten eine Shell-Funktion verwenden, um Ihre Nachrichten zu protokollieren, da dies einfacher zu verwenden ist:

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

Beachten Sie, dass Shell-Funktionen auf die gleichen Weise wie das Skript (über $1usw.) auf ihre eigenen Argumente zugreifen .

Das erste Skript sieht also so aus:

#!/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

(Beachten Sie, dass die Protokolldatei nicht genau das von Ihnen angegebene Format hat. Es ist besser, wenn der Zeitstempel am Anfang jeder Zeile steht.)

trojanfoe
quelle
7
#!/bin/bash

name=$1

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

starte "bash deploymLog.sh whatever" und du hast x.log mit

20120220-23:53:50 =>  whatever
Dyno Fu
quelle
Wenn du abstimmst, gib einen Grund an, danke.
Ich nehme an, der Abwähler hat den Grund dafür verpasst name=$1. Die Variable $ name wird nie verwendet, da Sie nur den String 'name' wörtlich ausgeben.
Manatwork
Oh, mein Schlimmes. Danke für den Hinweis. Ich muss vorsichtiger sein.
Dyno Fu
@DynoHongjunFu Trotzdem hat die Variable den gleichen Namen und Wert, was keine gute Möglichkeit ist, das Beispiel lesbar zu machen.
Volker Siegel
Am besten zitieren Sie die name="$1"
Jake