在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?
正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念、可靠性、易读性、性能和安全性。
这个答案解释了可靠性和易读性方面:
while IFS= read -r line <&3; do
printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)
为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置的read shell一次读取一个字符。
怎么样的概念和安全性方面?
我可能有一些绝对错误的地方,但对我来说看起来很有说服力,将 IFS 设置为pre-do/done 列表中的命令之一绝对没有效果。
外部 IFS(while构造外部)在下面脚本中显示的所有示例中都占优势。
这里发生了什么?我对 IFS 在这种情况下的作用有什么误解吗?我希望数组拆分结果如“预期”列中所示。
#!/bin/bash
xifs() { echo -n "$(echo -n "$IFS" | xxd -p)"; } # allow for null $IFS
show() { x=($1)
echo -ne " (${#x[@]})\t |"
for ((j=0;j<${#x[@]};j++)); do
echo -n "${x[j]}|"
done
echo -ne "\t"
xifs "$IFS"; echo
}
data="a b c"
echo -e "----- -- -- \t --------\tactual"
echo -e "outside \t IFS \tinside"
echo -e "loop \t Field \tloop"
echo -e "IFS NR NF \t …Run Code Online (Sandbox Code Playgroud) 鉴于以下ed脚本,
$ cat helloworld
a
hello
world
.
,n
,s,o,O,g
,n
Q
Run Code Online (Sandbox Code Playgroud)
我想以某种方式获得交互式输出
$ ed
a
hello
world
.
,n
1 hello
2 world
,s,o,O,g
,n
1 hellO
2 wOrld
Q
$
Run Code Online (Sandbox Code Playgroud)
而不是预期的
$ cat helloworld | ed
1 hello
2 world
1 hellO
2 wOrld
$
Run Code Online (Sandbox Code Playgroud)
这可能吗,也许使用第三方实用程序?提前致谢!
编辑:我想我应该增加一些动力。我想制作一些示例 ed 会话,并可能将它们保存为script(1). 如果此过程是“实时”执行的,则任何修改基本上都意味着再次键入整个教程(不好)或“弄清楚”输出,这可能是基于长时间的编辑会话(更糟)。
在以下示例中,inet 前有 4 个空格。
wolf@linux:~$ ip address show eth0 | grep 'inet '
inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0
wolf@linux:~$
Run Code Online (Sandbox Code Playgroud)
我如何计算这个例子中的空格数。
这个示例很简单,因为它只有 4 个空格。
如果它有更多呢?几百,几千?
是否有捷径可寻?