2011-08-23 66 views
6

我在我的終端shell中使用了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 

當什麼我會想的博客標題運行爲(忽略了一個事實的字符串需要操縱,使其更多的網址友好和路徑路徑/不存在)

即博客「博客標題」,輸出:

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

爲什麼$ DATE打印在打印$ FILE的調用上方而不是$ FILE中包含的字符串?

+0

'日期+%Y-%間%D'比'日期+ 20%清潔Y-%間%D'。 '日期+%F'甚至更乾淨。 (這裏假定你的'date'命令支持這些格式; GNU日期的確如此,但其他人可能不會。) –

回答

16

這裏有兩件事情會出錯。

首先,你的第一個片段並沒有做我認爲你認爲的事。嘗試刪除第二行,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,我不知道。

+0

非常讚賞,完全按照我的意願工作。你在哪裏知道bash,特別是諸如invoke-with-environment之類的東西?我很可能會遇到更多的問題,並且有一些地方可以提及,這對我有很大的幫助。 – HaaR

+0

孩子,我在街上學到了我的shell腳本。認真。隱喻,但嚴重。自1998年以來,我一直在使用unix命令行,偶爾會有一些腳本,而且我已經做了幾年嚴格的腳本編寫工作,作爲我工作的一部分。我和其他熟悉腳本的人一起工作並向他們學習。我在新聞組上提問。我閱讀我使用的軟件包中的腳本。當我找到它的時候我會閱讀很好的文檔 - 對於shell腳本來說,可悲的是,它並不常見。 –

+3

真正值得閱讀的三個文件是不完整的但是不可或缺的[高級Bash腳本指南](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)。 –

7

瞭解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外殼,http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html的規範,特別是如果你想在不同的操作系統上運行您的腳本(並且您發現自己在這種情況下的一個晴天!)
  • 閱讀關於shell編程的書籍。
  • 掛在Usenet新聞組comp.unix.shell那裏有很多貝殼的嚮導回答問題