2015-01-20 126 views
0

我创建了一个小脚本,以便我可以快速地将一些文本附加到Dropbox中的文件。shell(zsh)中的echo函数和括号的捕获

代码:

#!/bin/zsh 
echo $(date +%d/%m/%Y) $*>>/home/guillaume/Dropbox/note.txt 

如预期的功能工作。当在终端,I型:

$pc-guillaume$ note 123 

20/01/2015 123追加到note.txt

但如果有在传递给note函数的参数括号这是行不通的。

举例来说,如果我输入:

$pc-guillaume$ note 123(

我得到

> 

如果I型:

$pc-guillaume$ note() 

我得到:

function> 

如何修改我的脚本以使其能够捕获文字括号?

+1

报价是:'回声$(日期+%d /%M /%Y)“$ @“>>/home/guillaume/Dropbox/note。txt' – anubhava 2015-01-20 22:38:10

+0

我试过你的解决方案'$ pc-guillaume $ note(123)'并且得到了'zsh:找不到匹配项:(123)' – guillaume8375 2015-01-20 22:42:07

+0

我的错!我认为bash和zsh在这件事上并没有太大的不同。 – guillaume8375 2015-01-20 22:50:27

回答

3

用户需要调用脚本时添加引号:

$ note "123(" 

否则,你的脚本是永远不会启动或运行,因为外壳仍在寻找用户输入 - 所以,基于这个原因,有没有什么可以在你的脚本中修改这个行为;目前尚未掌控。


有一件事你可能要做的就是改变调用约定。如果你的脚本被改为像这样:

$ note 
123(
^D 

......那你就没有问题了。 (^D指的是键入ctrl + D,即文件结束符,但下面的实现也只是按下输入而没有输入作为输入结束符)。

你可能会实现这个像这样:

#!/bin/sh 
while read -r line && [ "$line" ]; do 
    printf '%s %s\n' "$(date +%d/%m/%Y)" "$line" 
done >>/home/guillaume/Dropbox/note.txt 

如果您不担心情况的日期的变化,而该程序正在运行,您可能会遇到的date命令只有一次,而不是吃每行运行一次的效率。另一个优化是利用现代shell中的内置功能(当然是bash 4.3,不能与zsh对话),用于内置于printf中的日期格式化,而不需要外部进程调用的开销。因此,一个有效的版本,利用现代化的bash功能(仅适用于使用bash的一个很新的释放系统):

#!/bin/bash 
# Warning: This requires Bash 4.3 
while IFS= read -r && [[ $REPLY ]]; do 
    printf '%(%d/%m/%Y)T %s\n' -1 "$REPLY" 
done >>/home/guillaume/Dropbox/note.txt 
+0

谢谢。我会尝试一下你的实现,因为我在Linux和编程方面比较新,所以我会使用William E. Schotts的* Linux命令行来理解它的细节。 – guillaume8375 2015-01-20 23:05:15

+0

我最强烈建议的参考文献是http://mywiki.wooledge.org/BashGuide和http://mywiki.wooledge.org/BashFAQ中的BashGuide和相关FAQ。这些都是freenode #bash IRC频道中的人们积极维护的资源(他们虽然有时很刺眼,但对精确度关心很大)。有一个不幸的是,大量的关于bash的书籍很少被编辑和编辑(通常是完全不准确的),尽管我不能特别谈论那个。 (ABS或“高级”bash脚本指南是另一个有大量Google juice的资源,但并不准确)。 – 2015-01-20 23:08:42

+0

BashFAQ#1 - http://mywiki.wooledge.org/BashFAQ/001 - 将开始您了解此答案的工作方式。 – 2015-01-20 23:10:21