繁体   English   中英

ZSH/Shell 变量赋值/使用

[英]ZSH/Shell variable assignment/usage

我将 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

为什么在打印 $FILE 的调用上方打印 $DATE 而不是 $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 所称的“扩展”。 有几种,按特定顺序执行:

扩词顺序如下:

  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 shell 的规范, http ://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html,特别是如果你想在不同的操作系统上运行你的脚本(你发现自己在那种情况下)美好的一天!)
  • 阅读有关 shell 编程的书籍。
  • 在 usenet 新闻组 comp.unix.shell 闲逛,那里有很多 shell 向导回答问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM