web-dev-qa-db-ja.com

ZSH /シェル変数の割り当て/使用法

私はターミナルシェルに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が印刷されるのはなぜですか?

9
HaaR

ここでは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がここで働いているかもしれません。

24
Tom Anderson

シェルが「拡張」と呼ぶものについて学びます。特定の順序で実行されるいくつかの種類があります。

Word展開の順序は次のとおりです。

  1. チルダ拡張
  2. パラメータ拡張
  3. コマンド置換
  4. 算術展開
  5. パス名展開set -fが有効でない限り
  6. 引用符の削除、常に最後に実行

チルダの拡張は、チルダが引用されていない場合にのみ実行されることに注意してください。つまり:

$ FILE="~/.zshrc"
$ echo $FILE
~/.zshrc
$ FILE=~./zshrc
$ echo $FILE
/home/user42/.zshrc

また、変数の割り当てでは、=の前後にスペースがあってはなりません。

コメントでシェルプログラミングを学ぶ場所を尋ねたので、いくつかのオプションがあります。

  • シェルのマニュアルページを読むman zsh
  • POSIXシェルの仕様を読んでください http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html 特に、スクリプトを異なるオペレーティングシステムで実行する場合(およびwillある晴れた日、その状況に陥ります!)
  • シェルプログラミングに関する本を読んでください。
  • 多くのシェルウィザードが質問に答えるusenetニュースグループcomp.unix.Shellにたむろしてください
11
Jens