ZSH / Shell变量赋值/用法

时间:2011-08-23 21:54:31

标签: macos bash shell unix 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

当运行我想要的博客标题时(忽略了字符串需要被操纵以使其更友好的URL并且路径路径/不存在的事实)

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

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

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

2 个答案:

答案 0 :(得分:22)

这里有两件事情出错了。

首先,你的第一个片段没有做我认为你认为的那样。尝试删除第二行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在这里工作,我不知道。

答案 1 :(得分:8)

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

单词扩展的顺序如下:

  1. 代表扩展
  2. 参数展开
  3. 命令替换
  4. 算术扩展
  5. 路径名扩展,除非set -f生效
  6. 引用删除,始终执行
  7. 请注意,波浪扩展仅在未引用波浪号时执行;即:

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

    在变量赋值中,=周围不能有空格。

    由于您在评论中询问了哪些学习shell编程,因此有以下几种选择:

    • 阅读shell的手册页man zsh
    • 阅读POSIX shell的规范http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html,特别是如果您想在不同的操作系统上运行脚本(并且 会在一天之内发现自己处于这种状态!)
    • 阅读有关shell编程的书籍。
    • 在usenet新闻组comp.unix.shell中闲逛,其中很多shell向导回答问题