私は最近readarray
Bash 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
\0
sep
0
ps[\0]
したがって、readarray -rd '' array
bash 4.4+は次のように書くことができますarray=( "${(@0)$(cat)}" )
。
しかし、重要な違いがあります。の場合はreadarray
区切り文字を-d
指定しd
、s
パラメータ拡張フラグは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)}")
cmd
readarray -t array < <(cmd)