Pasar argumentos de la línea de comandos al script bash


114

Soy nuevo en la programación de script bash.

Quiero implementar un script bash 'deploymLog', que acepta como entrada un argumento de cadena (nombre).

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

aquí quiero pasar el argumento de cadena (nombre) a través de la línea de comando

Como paso inicial, necesito agregar la marca de tiempo actual junto con esta cadena de entrada a un archivo de registro, digamos Logone.txten el directorio actual en el siguiente formato:

[name]=[System time timestamp1]

¿Como es posible?

Respuestas:


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

El primer argumento de una línea de comando se puede encontrar con el parámetro posicional $1. [[ -n "$name" ]]prueba para ver si $nameno está vacío. date +%sdevuelve la marca de tiempo actual en tiempo Unix. El >>operador se utiliza para escribir en un archivo agregando a los datos existentes en el archivo.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

Para una marca de tiempo más legible, puedes jugar con dateargumentos.


77
principiante total aquí ... sería útil saber qué [[ -n "$name" ]]está haciendo la parte.
MichaelChirico

Sí, eso es cierto. También soy un novato total y mi script se está muriendo en esa línea.
pythonian29033

44
El "[[-n" $ nombre "]]" es otra forma del comando "prueba". Ver: ss64.com/bash/test.html
jewettg

64

Se puede acceder a los argumentos de la línea de comandos de Shell a través de $1(el primero), $n(el enésimo) o $*(todos los argumentos), por lo que su script debe comenzar:

#!/bin/bash

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

name=$1

Ahora se puede acceder al argumento de nombre desde el script como $name.

Para obtener la marca de tiempo, use el date(1)comando y asígnele un especificador de formato para que produzca el formato que desea:

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

Ahora $nowcontiene la fecha y hora actuales.

Para que pueda crear su archivo de registro así:

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

Es mejor usar una función de shell para registrar sus mensajes, ya que será más fácil de usar:

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

Tenga en cuenta que las funciones de shell acceden a sus propios argumentos de la misma manera que el script (a través de $1etc.)

Entonces el guión inicial se ve así:

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

(tenga en cuenta que el archivo de registro no está en el formato exacto que especificó; está en uno mejor con la marca de tiempo al comienzo de cada línea).


7
#!/bin/bash

name=$1

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

ejecute "bash deploymLog.sh whatever", y obtendrá x.log con

20120220-23:53:50 =>  whatever

cuando vote hacia abajo, dé una razón, gracias.

Supongo que el votante se perdió la razón de name=$1. La variable $ name nunca se usa, ya que solo genera la cadena 'nombre' literalmente.
manatwork

Oh mi error. gracias por señalar Necesito ser más cuidadoso.
Dyno Fu

@DynoHongjunFu Aún así, la variable tiene el mismo nombre y valor, lo que no es una buena manera de hacer que el ejemplo sea legible.
Volker Siegel

Es mejor citar la var al asignar un nombre como este:name="$1"
Jake
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.