2012-05-05 89 views
6

我很無聊,並決定使用bash爲我的文本冒險編寫腳本。基本上,它應該在某些情況下爲打字機制作動畫,以便進行戲劇性的故事講述。我可以在一個文件中手動做到這一點,像這樣: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" 

你可以想像,這是可怕乏味。相反,我想一次從一個字符(或文件)中提取字符,並將睡眠命令應用於每個字符。

到目前爲止,我有以下幾點,從文件讀取。 IFS =允許空格保留,但不允許任何其他類型的空格(如換行符)。

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

有沒有一種方法可以使用它來獲取所有空格?作爲一個額外的問題,你能告訴我如何將它應用到用戶定義的腳本中,所以我不必從單獨的文件中讀取?因此,例如,假設我有一個名爲「hello」的字符串,並且只要將它傳遞給我的函數,只要在bash終端中運行我的文件,就可以作爲打字機進行動畫製作。

任何幫助,將不勝感激。謝謝!

+0

如何使用'tr(1)'將換行符轉換爲空格? – g13n

+0

如果我正確理解手冊頁,是否使用tr [:print:]選項? – derp

+1

+1只是因爲你決定用bash腳本打無聊:) –

回答

8

如何

#!/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 
+0

哇,謝謝!這正是我需要的。我仍然在學習shell腳本的語法,所以這非常有幫助。 – derp

+0

沒問題shell腳本很有趣:-) – jedwards

+1

@derp:不需要外部的'seq'和'expr'工具:'for((i = 0; i <$ {#text}; i ++))' –

0

@derp不,你需要使用tr -s [:blank:]來擠壓多個毛坯到一個。

HTH。

1

要回答原來的問題,你需要使用一個空的分隔符,以及:

#!/bin/bash 
getc() { 
    IFS= read -r -n1 -d '' "[email protected]" 
} 

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

相關問題