在 ZSH 中按空格拆分字符串

use*_*369 3 bash zsh array read

给这个file.txt

first line
second line
third line
Run Code Online (Sandbox Code Playgroud)

这适用于bash

while IFS=' ' read -a args; do
  echo "${args[0]}"
done < file.txt
Run Code Online (Sandbox Code Playgroud)

生产

first
second
third
Run Code Online (Sandbox Code Playgroud)

也就是说,我们能够逐行读取文件,并且在每一行上我们使用空格作为分隔符将行进一步拆分为一个数组。但是在 中zsh,结果是一个错误:read: bad option: -a

我们怎样才能做到与 inzsh一样bash呢?我已经尝试了几种解决方案,但我永远无法使用空格作为分隔符将字符串拆分为数组

Spa*_*awk 8

man zshbuiltins,zsh 的 read 改为使用-A

read [ -rszpqAclneE ] [ -t [ num ] ] [ -k [ num ] ] [ -d delim ]
     [ -u n ] [ name[?prompt] ] [ name ...  ]
...
       -A     The  first  name  is taken as the name of an array
              and all words are assigned to it.
Run Code Online (Sandbox Code Playgroud)

因此命令是

while IFS=' ' read -A args; do
  echo "${args[1]}"
done < file.txt
Run Code Online (Sandbox Code Playgroud)

注意默认情况下,zsh 数组编号以 开头1,而 bash 以0.

$ man zshparam
...
Array Subscripts
...
The elements are numbered  beginning  with  1, unless the
KSH_ARRAYS option is set in which case they are numbered from zero.
Run Code Online (Sandbox Code Playgroud)

  • 你是对的。我试过`-A`,但它似乎没有用。它是基于 1 的索引加上切片差异的组合,这让我绊倒了。 (2认同)