Macos ZSH/Shell变量赋值/用法

Macos ZSH/Shell变量赋值/用法,macos,bash,shell,unix,zsh,Macos,Bash,Shell,Unix,Zsh,我将ZSH用于我的终端外壳,虽然我已经编写了几个函数来自动化特定任务,但我从未真正尝试过任何需要我目前所追求的功能的东西 我最近用Jekyll重新编写了一个博客,我想用scp之类的工具自动化博客帖子的制作,并最终将新生成的文件上传到我的服务器 我对ZSH中的变量绑定/用法有点困惑;例如: DATE= date +'20%y-%m-%d' echo $DATE 如我所料,正确输出2011-08-23 但当我尝试时: DATE= date +'20%y-%m-%d' FILE= "~/path/t

我将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友好,并且路由路径/收件人不存在的事实)

i、 e.博客“博客标题”,输出:

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\u NAME=VAR\u 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;这里可能有我不知道的zshims在工作。

了解shell所称的“扩展”。有几种类型,按特定顺序执行:

单词扩展的顺序如下:

  • 瓷砖扩展
  • 参数扩展
  • 命令替换
  • 算术展开
  • 路径名扩展,除非
    set-f
    有效
  • 删除引号,始终在最后执行
  • 请注意,只有在不引用波浪线时才执行波浪线扩展;即:

    $ FILE="~/.zshrc"
    $ echo $FILE
    ~/.zshrc
    $ FILE=~./zshrc
    $ echo $FILE
    /home/user42/.zshrc
    
    变量赋值中的
    =
    周围不能有空格

    由于您在评论中询问了在何处学习shell编程,因此有几个选项:

    • 阅读壳牌的手册页面
      man zsh
    • 阅读POSIX外壳的规范,尤其是如果您想在不同的操作系统上运行脚本(您将在晴朗的一天发现自己处于这种情况!)
    • 阅读有关shell编程的书籍
    • 在usenet新闻组comp.unix.shell中,许多shell向导会回答问题

    非常感谢,完全符合我的要求。关于bash,您从哪里了解到的,特别是像环境调用之类的东西?我可能会遇到更多的问题,有地方可以参考会有很大帮助。孩子,我在街上学会了shell脚本。认真地隐喻性的,但严肃的。自1998年以来,我每天都在使用unix命令行,偶尔会编写一些脚本。几年来,我一直在认真编写脚本,这是我工作的一部分。我与其他熟悉脚本编写并从中学习的人一起工作。我在新闻组上提问。我阅读我使用的软件包中的脚本。当我找到好的文档时,我就阅读了它——遗憾的是,对于shell脚本来说,这并不常见。真正值得阅读的三个文档是零碎但不可或缺的,令人愉悦但相当令人畏惧的,当然还有,
    manbash
    。您还应该阅读和的优秀建议。
    date+%Y-%m-%d
    date+20%Y-%m-%d
    更干净<代码>日期+%F更干净。(假设您的
    date
    命令支持这些格式;GNU date支持,但其他命令可能不支持。)