Передайте аргументи командного рядка до bash script


114

Я новачок у програмі скриптів для bash.

Я хочу реалізувати bash-скрипт 'opensmLog', який приймає в якості введення один рядковий аргумент (ім'я).

[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

Так, правда, я теж тотальний noob, і мій сценарій вмирає на цій лінії ???
pythonian29033

4
"[[-N" $ name "]]" - це ще одна форма команди "test". Дивіться: ss64.com/bash/test.html
jewettg

64

Аргументи командного рядка Shell доступні через $1(перший), $n(n-й) або $*(всі аргументи), тому ваш сценарій повинен запускатися:

#!/bin/bash

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

name=$1

Тепер аргумент імені доступний із сценарію як $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 opensmLog.sh все що завгодно", і ви отримали x.log

20120220-23:53:50 =>  whatever

коли ви проголосуєте, дайте причину, дякую.

Я гадаю, що низовик пропустив причину name=$1. Змінна $ name ніколи не використовується, оскільки ви виводите буквально лише рядок 'name'.
манатура

ой, моя погана. дякую за вказівку. мені потрібно бути обережнішими.
Dyno Fu

@DynoHongjunFu Проте змінна має те саме ім’я та значення, що не є хорошим способом зробити приклад читабельним.
Волкер Зігель

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