zshにはbashの組み込みreadarrayと同じ機能がありますか?

zshにはbashの組み込みreadarrayと同じ機能がありますか?

私は最近readarrayBash v5.zshに対応するものがあることに気づきました。

ベストアンサー1

zshには組み込みコマンドはありませんが、readarrayこれを行う1行式がありますreadarray -t

myarray=("${(@f)$(< myfile)}")

通常のファイルの代わりに使用するには、次のものstdinを使用する必要がありますcat

myarray=("${(@f)$(cat)}")

コマンドの出力をキャプチャするには、次を使用することもできます。

myarray=("${(@f)$(command)}")

すべての例では、空行(コマンド置換によって切り捨てられた末尾行を除く)も配列に含まれています。空白行を維持したくない場合は、次のように変更してください。

myarray=(${(f)"$(< myfile)"})
myarray=(${(f)"$(cat)"})
myarray=(${(f)"$(command)"})

f(行eedの場合)は、実際にはすべての区切り文字の分割の省略形fで、またはおよびパラメータ拡張などのエスケープシーケンスを許可します。ショートカットを参照してください。ps[\n]s[sep]p\n\0sep0ps[\0]

したがって、readarray -rd '' arraybash 4.4+は次のように書くことができますarray=( "${(@0)$(cat)}" )

しかし、重要な違いがあります。の場合はreadarray区切り文字を-d指定しdsパラメータ拡張フラグはs区切り文字を使用します。

a<NUL><NUL>b<NUL>c<NUL>readarray -td '' array与えられたarray=(a '' b c)ような入力に通常必要とされない空の末尾の要素をarray=("${(@0)$(cat)}")提供します。array=(a '' b c '')を使って削除できますarray[-1]=()

NULで区切られたリストはファイルパスの保存によく使用されるため、削除してください。みんな空の要素は、array=(${(0)"$(grep -rlZ pattern .)"})この問題を回避する簡単な方法です。

bashとのもう一つの注目すべき違いは、bashとは対照的に終了状態が維持されることreadarrayです。array=("${(@f)$(cmd)}")cmdreadarray -t array < <(cmd)

おすすめ記事