Passar argumentos da linha de comando para bash script


114

Eu sou novo em bash programação de scripts.

Eu quero implementar um script bash 'deploymLog', que aceita como entrada um argumento de string (nome).

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

aqui eu quero passar o argumento string (nome) através da linha de comando

Como uma etapa inicial, preciso anexar o carimbo de data / hora atual junto com esta sequência de entrada a um arquivo de log, digamos Logone.txtno diretório atual no formato abaixo:

[name]=[System time timestamp1]

Como isso é possível?

Respostas:


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

O primeiro argumento de uma linha de comando pode ser encontrado com o parâmetro posicional $1. [[ -n "$name" ]]testes para ver se $namenão está vazio. date +%sretorna o registro de data e hora atual no horário Unix. O >>operador é usado para gravar em um arquivo anexando aos dados existentes no arquivo.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

Para um timestamp mais legível, você pode jogar com dateargumentos.


7
total iniciante aqui ... seria útil saber o que a [[ -n "$name" ]]parte está fazendo.
22816 MichaelChirico

Sim, isso é verdade Eu também sou um noob total e meu script está morrendo nessa linha ???
Pythonian29033

4
O "[[-n" $ name "]]" é outra forma do comando "test". Veja: ss64.com/bash/test.html
jewettg

64

Os argumentos da linha de comando do Shell são acessíveis via $1(o primeiro), $n(o enésimo) ou $*(todos os argumentos), portanto, seu script deve iniciar:

#!/bin/bash

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

name=$1

Agora, o argumento do nome está acessível no script como $name.

Para obter o registro de data date(1)e hora, use o comando e especifique o formato para que ele produza o formato desejado:

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

Agora $nowcontém a data e hora atuais.

Então você pode criar seu arquivo de log assim:

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

É melhor usar uma função shell para registrar suas mensagens, pois será mais fácil usar:

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

Observe que as funções do shell acessam seus próprios argumentos da mesma maneira que o script (via $1etc.)

Portanto, o script inicial fica assim:

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

(observe que o arquivo de log não está no formato exato que você especificou; está em um formato melhor com o registro de data e hora no início de cada linha).


7
#!/bin/bash

name=$1

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

execute "bash deploymLog.sh seja qual for" e você terá o x.log com

20120220-23:53:50 =>  whatever

quando você votar, dê um motivo, obrigado.

Suponho que o downvoter perdeu a razão de name=$1. A variável $ name nunca é usada, pois você produz apenas a string 'name' literalmente.
21412 manatwork

Oh culpa minha. obrigado por apontar. eu preciso ter mais cuidado
Dyno Fu

@DynoHongjunFu Ainda assim, a variável tem o mesmo nome e valor, o que não é uma boa maneira de tornar o exemplo legível.
Volker Siegel

É melhor para citar o var ao atribuir para citar como este:name="$1"
Jake
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.