Модераторы: powerfox, ZeeLax
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простой shell-скрипт не работает! 
:(
    Опции темы
maxipub
  Дата 12.11.2013, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Добрый день!

Ребята, ничего не могу понять. Почему не хочет работать такой скрипт:

Код

#!/bin/sh

echo $(date '-d "yesterday" +%F')


? Выдает ошибку:

Код

date: invalid date ` "yesterday" +%F'


Мне кажется, символ "-" надо как-то экранировать? Но как, не получилось... smile Заранее огромное спасибо!
PM MAIL   Вверх
tzirechnoy
Дата 12.11.2013, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Кавычки убрать.
PM MAIL   Вверх
maxipub
Дата 12.11.2013, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



tzirechnoy, да, спасибо, пару часов назад сам до этого дошел. smile А почему они тут не нужны? Например, echo $(date '+%F-%H-%M-%S') работает... smile

Добавлено через 37 секунд
И вообще, для чего они там? smile Инфу по сабжу очень сложно найти - кто как хочет, так и учит... А почему именно так - ни кто не пишет. smile
PM MAIL   Вверх
McMan
Дата 12.11.2013, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 21.2.2007
Где: Ярославль

Репутация: 1
Всего: 1



man date 
?
PM MAIL   Вверх
maxipub
Дата 13.11.2013, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



McMan, а при чем тут ман? Там с синтаксисом самой команды проблем вроде нет. Проблемы возникают с кавычками при вызове ее из скрипта. Ведь echo $(date '+%F-%H-%M-%S') работает, а echo $(date '-d "yesterday" +%F') - уже нет. Вот и неясно почему так.

echo $(date '+%F-%H-%M-%S') взял с примерка из одного сайта, там везде параметры взяты в кавычки. А зачем?
PM MAIL   Вверх
McMan
Дата 14.11.2013, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 21.2.2007
Где: Ярославль

Репутация: 1
Всего: 1



date +%F-%H-%M-%S     без кавычек  тоже работает
и
date -d "yesterday" '+%F'      тоже работает     
почему на одном сайте, все примеры взяты в кавычки затрудняюсь сказать 

а когда пишешь
date '-d "yesterday" +%F'
опция -d утилиты date попадает в кавычки, что нехорошо




PM MAIL   Вверх
maxipub
Дата 14.11.2013, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Цитата(McMan @  14.11.2013,  08:46 Найти цитируемый пост)
опция -d утилиты date попадает в кавычки, что нехорошо

Это понятно. А почему именно не хорошо, и вообще, для чего там кавычки? smile
PM MAIL   Вверх
tzirechnoy
Дата 20.11.2013, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



В юниксах аргументы командной строки передаются как список строк. Типично, если не ставить кавычки -- каждое слово -- одна строка. Т.е. echo 1 2 3 -- передаст три строки в echo: "1", "2" и "3". Команды обычно чутко реагируют на это разделение: один аргумент -- один элемент из списка (echo здесь в некотором роде исключение -- поскольку всё, что не опцыя -- объединяет с пробелами).

Кавычки позволяют изменить группировку аргументов -- например, если в аргументе есть пробел (или несколько пробелов), и они там (в аргументе) и должны остаться -- то кавычки -- самое то.

date '-d "yesterday" +%F' -- передаёт команде date один аргумент: -d "yesterday" +%F (без одинарных кавычек, которые увидел и использовал bash, но с двойными кавычками внутри). date -d "yesterday" +%F -- передаёт команде date 3 аргумента: -d, yesterday и +%F (без двойных кавычек вокруг yesterday, кстати, поскольку двойные кавычки тожэ bash использовал для группировки).

В первом случае date не считает -d "yesterday" +%F какой-то своей опцыей, потому считает, что раз это не опцыя -- то это указание даты (в формате, по ману [MMDDhhmm[[CC]YY][.ss]] ) -- и разумеется обамывается это так распарзить. О чём с говорит в сообщении "неверная дата".

Во втором случае -- первый аргумент -d -- говорит что потом пойдёт строка с датой в расшыренном формате, следующий (yesterday) -- собственно дата, третий, раз начинается с + -- формат вывода.

Да, ещё замечу про разницу двойных и одинарных кавычек (для bash): в одинарных кавычках никаких подстановок нет. И они продолжаются до следующей одинарной кавычки. В двойных кавычках -- есть подстановка переменных, начинается с символа $, есть подстановка результатов выполнения команд, начинаются с обратной кавычки, есть экранирование спецы.символов (тех жэ $, `, ", \) через обратный слэш ( \ ), ещё кажэтся подстановка восьмеричных кодов символов вида \060 и шэстнадцатиричных вида \0x30. А, и спец.символов \a, \b, \n, \r и т.д. В общем, захочешь -- прочтёшь.

Т.е. ls '/зургатор\060 $PID  / `echo 1`' -- предаст одним аргументом непосредственно все это \, $, пробелы, обратные кавычки. ls "/зургатор\060 $PID / `echo 1`" -- подставит вместо \060 -- 0, вместо $PID -- идэнтификатор процэсса, вместо `echo 1` -- то, что вывело echo без последнего перевода строки (т.е. 1). ls /зургатор\060 $PID  / `echo 1` -- передаст 4 аргумента: /зургатор0, идэнтификатор, /, 1.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.