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"

ご想像のとおり、それはひどく退屈です。代わりに、文字列 (またはファイル) から一度に 1 文字ずつ文字を取り出し、それぞれの文字にスリープ コマンドを適用します。

これまでのところ、ファイルから読み取る次のものがあります。IFS= はスペースを保持できますが、他のタイプの空白 (改行など) は保持できません。

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

これを使用してすべての空白を取得する方法はありますか? おまけの質問として、別のファイルから読み取る必要がないように、これをユーザー定義スクリプトに適用する方法を教えてください。たとえば、「hello」という文字列があり、それを関数に渡すだけで、bash ターミナルでファイルを実行するたびにタイプライターとしてアニメーション化できます。

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

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 に答える