Передать аргументы командной строки в скрипт bash


114

Я новичок в программировании сценариев Bash.

Я хочу реализовать сценарий bash 'deploymLog', который принимает в качестве входных данных один строковый аргумент (имя).

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

здесь я хочу передать строковый аргумент (имя) через командную строку

В качестве начального шага мне нужно добавить текущую метку времени вместе с этой входной строкой в ​​файл журнала, скажем, Logone.txtв текущем каталоге в следующем формате:

[name]=[System time timestamp1]

Как это возможно?

Ответы:


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

Первый аргумент из командной строки можно найти с помощью позиционного параметра $1. [[ -n "$name" ]]тесты, чтобы увидеть, если $nameне пусто. date +%sвозвращает текущую метку времени в Unix. >>Оператор используется для записи в файл, добавив к существующим данным в файле.

$> ./deploymLog.sh tt

$> cat Logone.txt 
tt=1329810941

$> ./deploymLog.sh rr

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

Для более удобочитаемой отметки времени вы можете поиграть с dateаргументами.


7
абсолютный новичок здесь ... было бы полезно узнать, что делает эта [[ -n "$name" ]]часть.
MichaelChirico

Да, это правда, я тоже абсолютный нуб, и мой сценарий умирает на этой линии ???
pythonian29033

4
"[[-N" $ name "]]" - это другая форма команды "test". См. Ss64.com/bash/test.html
jewettg

64

Аргументы командной строки оболочки доступны через $1(первый), $n(n-й) или $*(все аргументы), поэтому ваш скрипт должен запуститься:

#!/bin/bash

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

name=$1

Теперь аргумент name доступен из скрипта как $name.

Чтобы получить метку времени, используйте date(1)команду и задайте ей спецификатор формата, чтобы она вырабатывала нужный формат:

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

Теперь $nowсодержит текущую дату и время.

Таким образом, вы можете создать свой файл журнала следующим образом:

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

Вам лучше использовать функцию оболочки для регистрации ваших сообщений, так как это будет легче использовать:

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

Обратите внимание, что функции оболочки обращаются к своим собственным аргументам так же, как и к сценарию (через $1и т. Д.)

Итак, начальный скрипт выглядит так:

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

(обратите внимание, что файл журнала не в том формате, который вы указали; он лучше, с меткой времени в начале каждой строки).


7
#!/bin/bash

name=$1

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

запустите "bash deploymLog.sh", и вы получите x.log с

20120220-23:53:50 =>  whatever

когда вы проголосуете, укажите причину, спасибо.

Я полагаю, downvoter пропустил причину name=$1. Переменная $ name никогда не используется, поскольку вы выводите только строку «name» буквально.
manatwork

о мой плохой спасибо за указание. Мне нужно быть более осторожным.
Dyno Fu

@DynoHongjunFu Тем не менее, переменная имеет то же имя и значение, что не очень хороший способ сделать пример читабельным.
Фолькер Сигел

Лучше всего указывать переменную при назначении имени следующим образом:name="$1"
Джейк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.