6

我很无聊,决定使用 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 终端中运行我的文件,我就可以简单地将它传递给我的函数以作为打字机进行动画处理。

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

4

3 回答 3

10

怎么样

#!/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
于 2012-05-05T04:21:34.303 回答
1

要回答原始问题,您还需要使用空分隔符:

#!/bin/bash
getc() {
  IFS= read -r -n1 -d '' "$@"
}

typewriter() {
  while getc ch; do
    sleep 0.1; echo "$ch"
  done
}

基本上,read即使它还没有消耗足够的字符,它也会在换行符(默认分隔符)处停止。该-r标志还告诉它不要使用反斜杠。

完整说明:http: //jayferd.us/posts/2011-01-12-bash-adventures-read-a-single-character-even-if-its-a-newline

于 2013-01-21T23:06:51.253 回答
0

@derp 不,您需要使用tr -s [:blank:]将多个空白压缩到一个空白。

HTH。

于 2012-05-05T04:20:11.520 回答