Przekaż argumenty wiersza poleceń do skryptu bash

114

Jestem nowy w programowaniu skryptów bash.

Chcę zaimplementować skrypt bash „deploymLog”, który przyjmuje jako argument jeden ciąg znaków (nazwę).

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

tutaj chcę przekazać argument (nazwę) ciągu poprzez linię poleceń

Na początku muszę dołączyć bieżący znacznik czasu wraz z tym ciągiem wejściowym do pliku dziennika powiedzmy Logone.txtw bieżącym katalogu w poniższym formacie:

[name]=[System time timestamp1]

Jak to jest możliwe?

10b0
źródło

Odpowiedzi:

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

Pierwszy argument z wiersza poleceń można znaleźć za pomocą parametru pozycyjnego $1. [[ -n "$name" ]]testy, aby sprawdzić, czy $namenie jest pusty. date +%szwraca bieżący znacznik czasu w czasie uniksowym. >>Operator służy do zapisu do pliku poprzez dołączenie do istniejących danych w pliku.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

Aby uzyskać bardziej czytelny znacznik czasu, możesz grać dateargumentami.

ДМИТРИЙ МАЛИКОВ
źródło
7
totalny początkujący tutaj ... dobrze byłoby wiedzieć, co [[ -n "$name" ]]robi ta część.
MichaelChirico,
Tak, to prawda, jestem też totalnym noobem i mój skrypt umiera w tej linii ???
pythonian29033
4
„[[-N” $ name ”]]” to kolejna forma polecenia „test”. Zobacz: ss64.com/bash/test.html
jewettg
64

Argumenty linii poleceń powłoki są dostępne za pośrednictwem $1(pierwszego), $n(n-tego) lub $*(wszystkich argumentów), więc skrypt powinien się uruchomić:

#!/bin/bash

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

name=$1

Teraz argument nazwy jest dostępny ze skryptu jako $name.

Aby uzyskać znacznik czasu, użyj date(1)polecenia i nadaj mu specyfikator formatu, aby wygenerował żądany format:

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

Teraz $nowzawiera aktualną datę i godzinę.

Możesz więc utworzyć plik dziennika w ten sposób:

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

Lepiej jest używać funkcji powłoki do rejestrowania wiadomości, ponieważ będzie łatwiejsza w użyciu:

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

Zauważ, że funkcje powłoki mają dostęp do własnych argumentów w taki sam sposób, jak skrypt (przez $1itp.)

Tak więc początkowy skrypt wygląda następująco:

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

(zwróć uwagę, że plik dziennika nie ma dokładnie określonego formatu; jest lepszy, z datownikiem na początku każdej linii).

trojanfoe
źródło
7
#!/bin/bash

name=$1

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

uruchom „bash deploymLog.sh cokolwiek”, a otrzymasz x.log z

20120220-23:53:50 =>  whatever
Dyno Fu
źródło
kiedy głosujesz, podaj powód, dziękuję.
Przypuszczam, że downvoter nie podał powodu name=$1. Zmienna $ name nigdy nie jest używana, ponieważ dosłownie podajesz tylko ciąg „name”.
manatwork
o mój Boże. dzięki za wskazanie. muszę być bardziej ostrożny.
Dyno Fu,
@DynoHongjunFu Mimo to zmienna ma tę samą nazwę i wartość, co nie jest dobrym sposobem na uczynienie przykładu czytelnym.
Volker Siegel
Najlepiej zacytować var, przypisując do nazwy w ten sposób:name="$1"
Jake,