ZSH/Shell变量赋值/用法

Haa*_*aaR 9 unix macos bash shell zsh

我使用ZSH作为我的终端shell,虽然我已经编写了几个函数来自动执行特定任务,但我从来没有尝试过任何需要我目前所需功能的东西.

我最近使用Jekyll重新编写了一个博客,我希望自动生成博客文章,最后使用像scp这样的东西将新生成的文件上传到我的服务器.

我对ZSH中的变量绑定/用法略感困惑; 例如:

DATE= date +'20%y-%m-%d'
echo $DATE
Run Code Online (Sandbox Code Playgroud)

按照我的预期正确输出2011-08-23.

但是当我尝试:

DATE= date +'20%y-%m-%d'
FILE= "~/path/to/_posts/$DATE-$1.markdown"
echo $FILE
Run Code Online (Sandbox Code Playgroud)

它输出:

2011-08-23
blog.sh: line 4: ~/path/to/_posts/-.markdown: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

即博客"博客标题",输出:

2011-08-23
blog.sh: line 4: ~/path/to/_posts/-blog title.markdown: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*son 23

这里有两件事是错的.

首先,你的第一个片段没有做我认为你认为的那样.尝试删除第二行,echo.它仍然打印日期,对吗?因为这:

DATE= date +'20%y-%m-%d'
Run Code Online (Sandbox Code Playgroud)

不是变量赋值 - 它是date一个辅助环境变量的调用(一般语法是VAR_NAME=VAR_VALUE COMMAND).你是这个意思:

DATE=$(date +'20%y-%m-%d')
Run Code Online (Sandbox Code Playgroud)

你的第二个片段仍会失败,但不同.同样,您正在使用invoke-with-environment语法而不是赋值.你的意思是:

# note the lack of a space after the equals sign
FILE="~/path/to/_posts/$DATE-$1.markdown"
Run Code Online (Sandbox Code Playgroud)

我认为应该这样做.

免责声明:虽然我非常了解bash,但我最近才开始使用zsh; 这里可能有zshisms,我不知道.

  • 真正值得一读的三个文件是不完整但不可或缺的[Advanced Bash-Scripting Guide](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). (3认同)
  • 孩子,我在街上学会了我的 shell 脚本。严重地。比喻,但认真。自 1998 年以来,我每天都在使用 unix 命令行,偶尔会编写一些脚本,并且几年来我一直在认真编写脚本作为我工作的一部分。我与其他熟悉脚本的人一起工作并向他们学习。我在新闻组上提问。我阅读了我使用的包中的脚本。当我找到它时,我阅读了很好的文档 - 对于 shell 脚本,遗憾的是不经常使用。 (2认同)

Jen*_*ens 10

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

单词扩展的顺序如下:

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

请注意,波浪扩展仅在未引用波浪号时执行; 即:

$ FILE="~/.zshrc"
$ echo $FILE
~/.zshrc
$ FILE=~./zshrc
$ echo $FILE
/home/user42/.zshrc
Run Code Online (Sandbox Code Playgroud)

并且=在变量赋值中必须没有空格.

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

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