私はターミナルシェルにZSHを使用しており、特定のタスクを自動化するためにいくつかの関数を作成しましたが、現時点で必要な機能を必要とするものを実際に試したことはありません。
最近、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に含まれている文字列ではなく$ FILEを印刷する呼び出しの上に$ DATEが印刷されるのはなぜですか?
ここでは2つの問題が発生しています。
まず、最初のスニペットは、私が思っていることを実行していません。 2行目のecho
を削除してみてください。それでも日付は印刷されますよね?これは:
DATE= date +'20%y-%m-%d'
変数の割り当てではありません-補助環境変数を使用したdate
の呼び出しです(一般的な構文はVAR_NAME=VAR_VALUE COMMAND
です)。あなたはこれを意味します:
DATE=$(date +'20%y-%m-%d')
2番目のスニペットは引き続き失敗しますが、異なります。ここでも、割り当ての代わりに、invoke-with-environment構文を使用しています。もしかして:
# note the lack of a space after the equals sign
FILE="~/path/to/_posts/$DATE-$1.markdown"
私はそれがトリックをするべきだと思います。
免責事項:私はbashをよく知っていますが、最近zshを使い始めたばかりです。私が気付いていないzshismsがここで働いているかもしれません。
シェルが「拡張」と呼ぶものについて学びます。特定の順序で実行されるいくつかの種類があります。
Word展開の順序は次のとおりです。
set -f
が有効でない限りチルダの拡張は、チルダが引用されていない場合にのみ実行されることに注意してください。つまり:
$ FILE="~/.zshrc"
$ echo $FILE
~/.zshrc
$ FILE=~./zshrc
$ echo $FILE
/home/user42/.zshrc
また、変数の割り当てでは、=
の前後にスペースがあってはなりません。
コメントでシェルプログラミングを学ぶ場所を尋ねたので、いくつかのオプションがあります。
man zsh