Passer des arguments en ligne de commande au script bash


114

Je suis nouveau à la programmation de script 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 de chaîne (nom) en ligne de commande.

Pour commencer, je dois ajouter l’horodatage actuel avec cette chaîne d’entrée dans un fichier journal, par exemple, Logone.txtdans le répertoire actuel au format ci-dessous:

[name]=[System time timestamp1]

Comment c'est possible?

Réponses:


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

Le premier argument d'une ligne de commande peut être trouvé avec le paramètre positional $1. [[ -n "$name" ]]des tests pour voir si $namen'est pas vide. date +%srenvoie l'horodatage actuel dans l'heure Unix. 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 des datearguments.


7
débutant total ici ... il serait utile de savoir ce que fait la [[ -n "$name" ]]partie.
MichaelChirico

Ouais, c'est vrai, je suis aussi un noob total et mon script est en train de mourir sur cette ligne ???
pythonian29033

4
Le "[[-n" $ name "]]" est une autre forme de la commande "test". Voir: ss64.com/bash/test.html
jewettg

64

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

#!/bin/bash

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

name=$1

Maintenant, l'argument de nom est accessible depuis le script en tant que $name.

Pour obtenir l’horodatage, utilisez la date(1)commande et donnez-lui un spécificateur de format pour obtenir le format souhaité:

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

$nowContient maintenant la date et l'heure actuelles.

Vous pouvez donc créer votre fichier journal de la manière suivante:

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

Il est préférable d’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 du shell accèdent à leurs propres arguments de la même manière que le script (via $1etc.)

Donc, 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’a pas le format exact que vous avez spécifié; il en est un meilleur avec l’horodatage au début de chaque ligne).


7
#!/bin/bash

name=$1

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

lancez "bash deploymLog.sh peu importe", et vous obtenez x.log avec

20120220-23:53:50 =>  whatever

quand vous votez, donnez une raison, merci.

Je suppose que le votant inférieur a raté la raison de name=$1. La variable $ name n'est jamais utilisée, car vous ne sortez que la chaîne 'name' littéralement.
Manatwork

oh, mon mauvais. merci d'avoir signalé. J'ai besoin d'être plus prudent.
Dyno Fu

@DynoHongjunFu Néanmoins, la variable a le même nom et la même valeur, ce qui n'est pas un bon moyen de rendre l'exemple lisible.
Volker Siegel

Il est préférable de citer le var lors de l'attribution d'un nom comme celui-ci:name="$1"
Jake le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.