Назначение / использование переменных ZSH / Shell - PullRequest
8 голосов
/ 24 августа 2011

Я использую ZSH для своей терминальной оболочки, и хотя я написал несколько функций для автоматизации конкретных задач, я никогда не пытался сделать что-либо, что требовало бы функциональности, которой я сейчас пользуюсь.

Недавно я переписал блог, используя Jekyll, и я хочу автоматизировать создание постов в блоге и, наконец, загрузку вновь созданных файлов на мой сервер, используя что-то вроде scp.

Я немного озадачен связыванием / использованием переменных в ZSH; например:

DATE= date +'20%y-%m-%d'
echo $DATE

правильно выводит 2011-08-23, как я и ожидал.

Но когда я пытаюсь:

DATE= date +'20%y-%m-%d'
FILE= "~/path/to/_posts/$DATE-$1.markdown"
echo $FILE

Выводит:

2011-08-23
blog.sh: line 4: ~/path/to/_posts/-.markdown: No such file or directory

И при запуске с тем, что я хотел бы, чтобы заголовок блога был (игнорируя тот факт, что необходимо манипулировать строкой, чтобы сделать ее более удобной для URL, и что маршрут / путь не существует)

т.е. блог "название блога", выходы:

2011-08-23
blog.sh: line 4: ~/path/to/_posts/-blog title.markdown: No such file or directory

Почему $ DATE печатает над вызовом print $ FILE, а не строкой, включаемой в $ FILE?

Ответы [ 2 ]

22 голосов
/ 24 августа 2011

Две вещи идут не так, как надо.

Во-первых, ваш первый фрагмент не делает то, что я думаю, вы думаете.Попробуйте удалить вторую строку, echo.Это все еще печатает дату, верно?Потому что это:

DATE= date +'20%y-%m-%d'

Не является присваиванием переменной - это вызов date со вспомогательной переменной среды (общий синтаксис VAR_NAME=VAR_VALUE COMMAND).Вы имеете в виду это:

DATE=$(date +'20%y-%m-%d')

Ваш второй фрагмент все равно не удастся, но по-другому.Опять же, вы используете синтаксис invoke-with-environment вместо присваивания.Вы имеете в виду:

# note the lack of a space after the equals sign
FILE="~/path/to/_posts/$DATE-$1.markdown"

Я думаю, это должно сработать.

Отказ от ответственности: хотя я очень хорошо знаю bash, я только недавно начал использовать zsh;здесь могут быть зшизмы, о которых я не знаю.

8 голосов
/ 25 августа 2011

Узнайте о том, что оболочка называет «расширением».Существует несколько видов, выполняемых в определенном порядке:

Порядок расширения слов следующий:

  1. расширение тильды
  2. расширение параметра
  3. подстановка команды
  4. арифметическое расширение
  5. расширение пути ,если set -f не действует
  6. удаление цитаты , всегда выполняется последним

Обратите внимание, что расширение тильды выполняется только тогда, когда тильда не указана;viz.:

$ FILE="~/.zshrc"
$ echo $FILE
~/.zshrc
$ FILE=~./zshrc
$ echo $FILE
/home/user42/.zshrc

И не должно быть пробелов вокруг = в присваиваниях переменных.

Поскольку вы спросили в комментарии, где изучать программирование оболочки, есть несколько вариантов:

  • Прочтите страницу руководства оболочки man zsh
  • Прочитайте спецификацию оболочки POSIX, http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html,, особенно если вы хотите запускать свои скрипты в разных операционных системах (и вы окажетесь в такой ситуации в один прекрасный день!)
  • Прочитайте книги о программировании оболочки.
  • Зависайте в группе новостей usenet comp.unix.shell, гдемного мастеров-панцирей отвечают на вопросы
...