2007年 10月 23日

zsh で blosxom クローン

http://coderepos.org/share/browser/lang/shellscript/blosxom.zsh/

entries[$i]="foo 1 bar 2"
typeset -A entry
: ${(AA)entry::=${(z)entries[$i]}}

とかやると、entry に { foo => 1, bar => 2 } みたいな連想配列が入る (実際には Perl みたいには書けない) 連想配列のキーをとりだすには ${(k)aarray} する。

typeset -A は連想配列の宣言 typeset -a だと配列の宣言になる。基本的に宣言なしで変数は使えるけど、連想配列は絶対に宣言しないといけない。

(AA) は連想配列をつくるやつ。(A) だと配列になる。(z) はコマンドラインにそれが書かれたかのようにアンエスケープしながら分割する。: は何もしないコマンド。引数評価だけされる。

エスケープは (q) でできる

foo="aaa  (aa)  "

echo ${(q)foo}    #=> aaa\ \(aa\)\ \
echo ${(qq)foo}   #=> 'aaa (aa)  '
echo ${(qqq)foo}  #=> "aaa (aa)  "
echo ${(qqqq)foo} #=> $'aaa (aa)  '

foo が空のとき (q) だとなんもなくなるのでまずい。(qq) のほうが安全

man zshall /Parameter Expansion Flags