Rob*_*bie 5 arrays file-io zsh
我试图在一个文件中读取一个行数组然后遍历它zsh,并且我大部分时间都得到了代码,除非输入文件包含某些字符(如括号).这是它的片段:
#!/bin/zsh
LIST=$(cat /path/to/some/file.txt)
SIZE=${${(f)LIST}[(I)${${(f)LIST}[-1]}]}
POS=${${(f)LIST}[(I)${${(f)LIST}[-1]}]}
while [[ $POS -le $SIZE ]] ; do
ITEM=${${(f)LIST}[$POS]}
# Do stuff
((POS=POS+1))
done
Run Code Online (Sandbox Code Playgroud)
这样做会更简单吗?我还需要计算文件中的行数.
ZyX*_*ZyX 11
#!/bin/zsh
zmodload zsh/mapfile
FNAME=/path/to/some/file.txt
FLINES=( "${(f)mapfile[$FNAME]}" )
LIST="${mapfile[$FNAME]}" # Not required unless stuff uses it
integer POS=1 # Not required unless stuff uses it
integer SIZE=$#FLINES # Number of lines, not required unless stuff uses it
for ITEM in $FLINES
# Do stuff
(( POS++ ))
endfor
Run Code Online (Sandbox Code Playgroud)
你的代码中有一些奇怪的东西:
LIST
每次分裂而不是把它变成数组变量?这只是浪费CPU时间.for ITEM in ${(f)LIST}
?$#ARRAY
.无需确定最后一个元素的索引.POS
获得与SIZE
代码中相同的值.因此它只会迭代一次.(I)
匹配模式.阅读文档.我知道问题得到解答已经有很多时间,但我认为值得发布一个更简单的答案(不需要zsh/mapfile外部模块):
#!/bin/zsh
for line in "${(@f)"$(</path/to/some/file.txt)"}"
{
// do something with each $line
}
Run Code Online (Sandbox Code Playgroud)
小智 6
出于示例目的,假设其中file.txt
包含以下文本:
one
two
three
Run Code Online (Sandbox Code Playgroud)
解决方案取决于您是否要删除中的空行file.txt
:
lines
从文件创建一个数组file.txt
,删除空行:
one
two
three
Run Code Online (Sandbox Code Playgroud)
预期输出:
3
Run Code Online (Sandbox Code Playgroud)
lines
从文件创建数组file.txt
,不删除空行:
typeset -a lines=("${(f)"$(<file.txt)"}")
print ${#lines}
Run Code Online (Sandbox Code Playgroud)
预期输出:
5
Run Code Online (Sandbox Code Playgroud)
最后,结果数组的差异是大括号扩展期间是否提供参数扩展标志的结果。 (@)