2014-01-09 3 views
0

Помогите мне с этим скриптом?Передача переменной оболочки команде mktime awk

#!/bin/bash 
data=`date '+%Y %m %d'` 
data2=" 7 0 0" 
string=$data$data2 
awk -v str=$string '{print mktime("str");}' 

I'm получаю этот выход:

awk: cmd. line:1: fatal: cannot open file `09' for reading (No such file or directory) 
+0

Эта одна команда может заменить ваш скрипт: 'date -d" 7:00 "+% s', предполагая, что вы имеют дату GNU. –

ответ

2

Вы не должны цитировать str внутри AWK иначе оно рассматривается как текстовая строка. Вы также должны правильно указывать переменные оболочки.

#!/bin/bash 

data=$(date '+%Y %m %d') 
data2=" 7 0 0" 
string="$data$data2" 

awk -v str="$string" 'BEGIN {print mktime(str)}' 
+0

Удаление котировок не сработало ... – user3178903

+1

@ user3178903, вы ** должны ** использовать цитаты здесь: '-v str =" $ string "' –

+0

Можете ли вы заменить первые 3 строки на строку = $ (date '+ % Y% m% d 07 00 00 ')? И я думал, что mktime() потребовало дату с ведущими нулями в часы, т. Е. 07 00 00, а не 7 0 0? И все дело в том, что мой iMac работает с OSX с awk-версией 20070501? Любые предложения? –

0

@anubhava имеет правильный ответ. Вот почему: после подстановки переменной, оболочка видит эту строку в коде:

awk -v str=2014 01 09 7 0 0 '{print mktime("str");}' 

Итак, вы передаете «2014» как «ул» переменной, ваш AWK скрипт «01» (который является действительная awk-программа, которая будет печатать каждую строку) и передает аргументы файла «09», «7», ... Следовательно, ошибка «не может открыть файл« 09 »для чтения»

Урок: в сценариях оболочки, кроме вы знаете, когда не, всегда процитировать свой "$variables".

+0

#!/Bin/bash set -x data = 'date '+% Y% m% d'' data2 = "7 0 0" string = "$ data $ data2" awk -v str = $ string' {print mktime (str);} 'awk : cmd. line: 1: fatal: невозможно открыть файл '09 'для чтения (нет такого файла или каталога) – user3178903

+1

Почему вы игнорируете мой совет:' -v str = "$ string" '- ** с котировками ** –

0

Вы хотите:

#!/bin/bash 
data="`date '+%Y %m %d'`" 
data2=" 7 0 0" 
string="$data$data2" 
awk -v str="$string" 'BEGIN {print mktime(str);exit;}' 

Другой альтернативой для awk линии: (Это имеет преимущество работы на старых awk версий, которые не имеют возможность -v, как Solaris 10 /usr/bin/awk (Они, как правило, пропустить mktime хотя))

awk "BEGIN {print mktime(\"$string\");exit;}" 

Бегина блок необходим, чтобы awk запустить код при запуске, а не для каждого входного лития северо-восток

exit необходим, чтобы заставить его выйти, прежде чем он ждет ввода. (Это похоже на работу без него на поглазеть)

Кавычки необходимы, чтобы передать переменную в качестве одной записи ... This overview of shell quoting важно чтение для тех, кто пытается сценарии оболочки ...

Кавычки в awk код необходимо оставить вне, чтобы получить awk, чтобы использовать переменную str, а не строку str.

Возможно, вы также захотите заменить обратные метки (``) на $(), его гораздо легче читать в сложных, вложенных случаях и поддерживать во всех современных оболочках (похоже, что это может быть в стандарте POSIX, я раю 't проверен хотя ...) .. (Это не влияет на код в этом случае, хотя)

+0

(Поскольку большинство вещей, за исключением «exit», были отвечены уже другими людьми, я сделал это сообщество wiki ...) –

Смежные вопросы