zsh の for は何か bash と違うと思ったら
どうやら zsh では isf 区切りではなく配列を使うようだ。
先に配列について調べておく必要があるな。
配列は [1] から始まるんかい。
lua なんかもそうだけど何故ゼロにしなかったのか。
bash と整合性が、、、、、
って bash では isf 区切りが基本すぎて誰も使っていないと思うけーが。
シェルスクリプトの文字列と配列 – L’Isola di Niente
コイツを zsh 向けに書き換えしてみよう。
#!/bin/zsh # 配列の作成、括弧で囲む array=(先頭 次の項目 最後) # echo してみる、インデックス指定無しだと先頭が出力される echo $array #=> 先頭 # インデックスは C 言語と同様 # bash と違って中括弧不要 # 先頭は 1 で最後は -1 #echo ${array[1]} echo $array[2] #=> 次の項目 # += で追加できる # bash と違い括弧で囲む必要はない #array+=(追加) array+=追加 # 全てを出力する時は @ を指定 echo $array[@] #=> 先頭 次の項目 最後 追加 # インデックスを使って追加や書き換えできる # bash と同じだけどインデックスに注意 array[3]=三番目 echo $array[@] #=> 先頭 次の項目 三番目 追加 # 範囲は関係ない、インデックスは並び順ではなく番号 array[10]=九番目 echo $array[10] #=> 九番目 # 単なる未定義になる echo 百番目は $array[100] です #=> 百番目は です # ポインタではない array[-2]=$array[1] array[1]=最初 echo $array[-2] #=> 先頭 # bash で全てを出力する時は @ を指定 # for item in "${array[@]}"; do for item in $array; do echo "item: $item" done # bash と同じヒアドキュメントで無理やり複数業コメントが可能 # atom, vscode 等は色分けしてくれる : << __OUTPUT__ item: 最初 item: 次の項目 item: 三番目 item: 追加 item: 先頭 item: 九番目 __OUTPUT__ # こんな初期化もでき...なかった #new_array=([1]=456 [2]=789 [0]=123) #echo $new_array[@] #=> error
なるほど、bash よりは簡単に使えるようにっているんだね。
Python 等が解る人ならインデックスにさえ注意すれば普通に扱える。
もっと機能はあるけど push(append) と for を覚えれば大抵困らない。
で、for はやはり配列を回すということみたい。
#!/bin/zsh # 以下は共通です # *.sh 等のワイルドカードも使えます for f in これは 共通 です; do echo $f done # 変数に入れる場合 zsh は配列にする # ワイルドカードなら arr=(*.sh), isf=*.sh # てか zsh は arr=*.sh としてもワイルドカードを展開しない if [[ $ZSH_EVAL_CONTEXT = toplevel ]]; then arr=(zshは 配列に します) for s in $arr; do echo $s done # 省略構文、変数が配列でも括弧が必要 #for a ($arr) echo $a else isf='bashはご存知 isf 区切りです' for s in $isf; do echo $s done fi # zsh の省略文 # do done の代わりにブレースを使うこともできる # ブレース展開の結果が異なる echo {02..10} # bash: 2 3 4 5 6 7 8 9 10 # zsh: 02 03 04 05 06 07 08 09 10
ワイルドカード展開も配列になるのかなと思ったけど違うようだ。
bash と違ってイコール直後のアスタリスクは只の文字列扱いになるし。
in 直後の isf 区切りのみ特別扱いってことなのかな?
実際それで実用上は問題は無い気もする。
すごく機能は豊富だけど覚える必要があるかどうかは微妙。
それより発見、ブレース展開が小細工せずにゼロ詰めできる!
これだけのために Fedora にも zsh を入れようかと思うくらい便利。
って、ここ何のブログだっけ?