我使用 ZSH 作为我的终端 shell,虽然我已经编写了几个函数来自动执行特定任务,但我从未真正尝试过任何需要我目前所追求的功能的东西。
我最近使用 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 打印在打印 $FILE 的调用上方,而不是 $FILE 中包含的字符串?
这里有两件事出了问题。
首先,您的第一个片段并没有按照我认为您的想法进行。尝试删除第二行,
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;这里可能存在我不知道的zshisms。
了解 shell 所谓的“扩展”。有几种,按特定顺序执行:
单词扩展顺序如下:
set -f
有效请注意,波浪号扩展仅在波浪号不带引号时才执行;即:
$ FILE="~/.zshrc"
$ echo $FILE
~/.zshrc
$ FILE=~./zshrc
$ echo $FILE
/home/user42/.zshrc
并且变量赋值中
=
周围不能有空格。
既然您在评论中询问在哪里学习 shell 编程,有几种选择:
man zsh