web-dev-qa-db-fra.com

Passer des arguments de ligne de commande au script bash

Je suis nouveau dans la programmation de scripts bash.

Je veux implémenter un script bash 'deploymLog', qui accepte en entrée un argument de chaîne (nom).

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

ici, je veux passer l'argument chaîne (nom) via la ligne de commande

Dans un premier temps, je dois ajouter l'horodatage actuel avec cette chaîne d'entrée à un fichier journal indiquant Logone.txt dans le répertoire courant au format ci-dessous:

[name]=[System time timestamp1]

Comment c'est possible?

121
chinchu
$> 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

Le premier argument d'une ligne de commande peut être trouvé avec le paramètre positionnel $1. [[ -n "$name" ]] teste pour voir si $name n'est pas vide. date +%s renvoie l'horodatage actuel en temps Unix. Le >> L'opérateur est utilisé pour écrire dans un fichier en ajoutant aux données existantes dans le fichier.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

Pour un horodatage plus lisible, vous pouvez jouer avec les arguments date.

Les arguments de la ligne de commande du shell sont accessibles via $1 (Le premier), $n (Le nième) ou $* (Tous les arguments), donc votre script doit démarrer:

#!/bin/bash

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

name=$1

L'argument nom est désormais accessible depuis le script sous la forme $name.

Pour obtenir l'horodatage, utilisez la commande date(1) et donnez-lui un spécificateur de format afin qu'il produise le format souhaité:

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

Maintenant $now Contient la date et l'heure actuelles.

Vous pouvez ainsi créer votre fichier journal ainsi:

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

Il vaut mieux utiliser une fonction Shell pour enregistrer vos messages car il sera plus facile à utiliser:

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

Notez que les fonctions Shell accèdent à leurs propres arguments de la même manière que le script (via $1 Etc.)

Ainsi, le script initial ressemble à ceci:

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

(notez que le fichier journal n'est pas au format exact que vous avez spécifié; il est meilleur avec l'horodatage au début de chaque ligne).

66
trojanfoe
#!/bin/bash

name=$1

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

exécutez "bash deploymLog.sh que ce soit", et vous obtenez x.log avec

20120220-23:53:50 =>  whatever
7
Dyno Fu