在Bash中,如何逐个字符从字符串中读取文本,包括空格?

7

我很无聊,决定用bash编写一个基于文本的冒险游戏脚本。基本上,它应该在某些情况下模拟打字机以进行戏剧性的叙述。我可以在文件中手动完成这个过程,就像这样:

sleep 0.1 
echo -n "h"
sleep 0.1 
echo -n "e"
sleep 0.1 
echo -n "l"
sleep 0.1 
echo -n "l"
sleep 0.1 
echo -n "o"

想象一下,这是非常乏味的。相反,我想从字符串(或文件)中逐个字符获取字符,并对每个字符应用sleep命令。

到目前为止,我有以下从文件中读取的内容。IFS=允许空格保留,但不允许其他类型的空格(如换行符)。

IFS=
while read -n1 achar
do
   echo $achar
done < aFile

有没有一种方法可以使用这个来获取所有的空格?作为一个额外的问题,你能告诉我如何将其应用于用户定义的脚本,这样我就不必从单独的文件中读取了吗?因此,例如,假设我有一个名为“hello”的字符串,我可以简单地将其传递给我的函数,在我在bash终端中运行我的文件时,将其作为打字机动画。

任何帮助都将不胜感激。谢谢!


使用 tr(1) 将换行符转换为空格,怎么样? - g13n
如果我理解手册正确的话,我需要使用tr[:print:]选项吗? - derp
1
+1 只因为你决定用 Bash 脚本来对抗无聊 :) - mariotoss
3个回答

12

您好

#!/bin/bash

function typewriter
{
    text="$1"
    delay="$2"

    for i in $(seq 0 $(expr length "${text}")) ; do
        echo -n "${text:$i:1}"
        sleep ${delay}
    done
}


typewriter "Typewriters are cool." .1
echo # <-- Just for a newline

1
哇,谢谢!这正是我所需要的。我仍在学习Shell脚本的语法,所以这对我帮助很大。 - derp
1
没问题,Shell脚本编程很有趣 :-) - jedwards
2
@derp:不需要使用外部的 seqexpr 工具:for ((i = 0; i < ${#text}; i++)) - Dennis Williamson
这让它看起来更像我习惯的C++。:) - derp

1

0

@derp 不,你需要使用tr -s [:blank:]将多个空格压缩为一个。

希望对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接