2011-08-23 201 views
6

我在我的终端shell中使用了ZSH,虽然我已经编写了几个函数来自动执行特定的任务,但我从未真正尝试过任何需要我此刻的功能的东西。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 

当什么我会想的博客标题运行为(忽略了一个事实的字符串需要操纵,使其更多的网址友好和路径路径/不存在)

即博客“博客标题”,输出:

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

为什么$ DATE打印在打印$ FILE的调用上方而不是$ FILE中包含的字符串?

+0

'日期+%Y-%间%D'比'日期+ 20%清洁Y-%间%D'。 '日期+%F'甚至更干净。 (这里假定你的'date'命令支持这些格式; GNU日期的确如此,但其他人可能不会。) –

回答

16

这里有两件事情会出错。

首先,你的第一个片段并没有做我认为你认为的事。尝试删除第二行,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,我不知道。

+0

非常赞赏,完全按照我的意愿工作。你在哪里知道bash,特别是诸如invoke-with-environment之类的东西?我很可能会遇到更多的问题,并且有一些地方可以提及,这对我有很大的帮助。 – HaaR

+0

孩子,我在街上学到了我的shell脚本。认真。隐喻,但严重。自1998年以来,我一直在使用unix命令行,偶尔会有一些脚本,而且我已经做了几年严格的脚本编写工作,作为我工作的一部分。我和其他熟悉脚本的人一起工作并向他们学习。我在新闻组上提问。我阅读我使用的软件包中的脚本。当我找到它的时候我会阅读很好的文档 - 对于shell脚本来说,可悲的是,它并不常见。 –

+3

真正值得阅读的三个文件是不完整的但是不可或缺的[高级Bash脚本指南](http://tldp.org/LDP/abs/html/),令人愉快而又令人生畏的[Bash参考手册](http: //www.gnu.org/software/bash/manual/bashref.html),当然还有'man bash'。你还应该阅读[Richard Kettlewell](http://www.greenend.org.uk/rjk/2001/04/shell.html)和[David Pashley](http://www.davidpashley.com)的出色建议/articles/writing-robust-shell-scripts.html)。 –

7

了解shell称为“扩展”的内容。有几种类型,在特定顺序执行:

字膨胀的顺序如下:

  1. 波浪线扩展
  2. 参数扩展
  3. 命令替换
  4. 算术扩展
  5. 路径扩展,除非set -f实际上是
  6. 引用删除,总是在最后执行

注意,当波浪没有加引号波浪线扩展时,才执行;即:

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

而且必须有变量赋值的=周围没有空格。

既然你在评论哪里学shell编程问,有几个选项:

  • 阅读shell的手册页man zsh
  • 阅读POSIX外壳,http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html的规范,特别是如果你想在不同的操作系统上运行您的脚本(并且您发现自己在这种情况下的一个晴天!)
  • 阅读关于shell编程的书籍。
  • 挂在Usenet新闻组comp.unix.shell那里有很多贝壳的向导回答问题