请不要给我一个直接的解决方案,我试图学习如何做到这一点只是为了好玩,你们能指出我正确的方向吗?
我想创建一个可以应用于我的脚本的小设备或功能。如果我有以下变量:
Vowel=; sleep 0.17
Consonant=; sleep 0.21
如何设置函数或循环以实现以下效果?
以上功能或脚本需要......
echo "Hello"
并将其转换为......
echo -n "H" ; sleep 0.21 ; echo -n "e" ; sleep 0.17 ; echo -n "l" ; sleep 0.21 ; echo -n "l" ; sleep 0.21 ; echo "o" ; sleep 0.17
这样做的目的是将脚本中的任何echo命令转换为上面的内容,以实现在终端屏幕上显示的回显文本的效果。
基本上我想创建一个函数,除了每次我希望echo命令看起来好像被输入到终端
中时,我必须在远远超过我的脚本中输入每个echo命令。提前致谢!
经过一番努力,我想出了这个
#!/bin/bash
Vowel= ; sleep 0.17
Consonant= ; sleep 0.21
array=()
#dummy function to test a string
variable="hello"
function steve {
#start a 0, going up until i is greater than the number of characters in the variable
for (( i=0; i<${#variable}; i++)); do
#puts each charecter into an array
array+=($(echo "${variable:$i:1}"))
done
#for each item in the array which should be each letter in variable, echo on the same line each letter, and sleep
for i in "${array[@]}"
do
echo -n $i ; sleep 0.21
done
#adds a space after the command
echo ""
}
#calling the function as a dummy
steve
到目前为止,该脚本似乎有效,它吐出了#34;你好&#34;使用睡眠
现在我再次陷入困境,当我用;sleep 0.21
替换$Vowel
时,它无法正常工作
为什么不?
此外,现在它只能处理$variable="hello"
字符串,我将如何更改它以便它可以解决这样的问题
echo "hello" | steve
答案 0 :(得分:1)
一些bash
# global vars for sleep intervals
Vowel=0.17
Consonant=0.21
# test if a character is a vowel
isvowel () {
local -l char=${1:-x};
[[ "aeiou" == *"$char"* ]]
}
# do it
printslowly() {
local text="$*"
local char i
for ((i=0; i < "${#text}"; i++)); do
char=${text:i:1}
if isvowel "$char"; then
sleep $Vowel
else
sleep $Consonant
fi
printf "%s" "$char"
done
echo
}
答案 1 :(得分:0)
你需要这些:
(如果您需要完整的灰色字段提示,它们会在我的桌面上显示。. . .
表示您需要自己弄清楚这部分。)
地图,如果字符是元音或辅音,它将保留信息。您可以使用一个关联数组,其中字母为键,值为CONSONANT(C)或VOWEL(V)。
declare . . . map
#declaration of associative array map
map=( . . . . . . )
#填充值
源阅读器,您将通过输入提供。这可以是一种功能。
while read . . . . .; . . . . . . .; done < <(. . . . .)
翻译将所需内容转化为想要的内容。
${. . . . .}
#decode字符c
的值。请记住,有大写字母和大写字母。最重要的是,注入你喜欢的东西。
打包将所有内容四舍五入,让外界轻松访问。您可能只希望它是一个可扩展的函数,或者您可能希望它是一个以单词作为参数的脚本。您可能还希望它能够从管道或交互式读取标准输入。另一个功能是读取作为参数传递的文件。最后,您可能希望赋予它写入功能,这将使用输出填充新旧文件。
参考:
答案 2 :(得分:0)
使用eval
和sed
代码转换字母等功能
各种延迟,加上一些变量:
vowel=0.17 consonant=0.21
slowecho ()
{
eval $(echo "$@" | \
sed -n 's/./&\n/gp' | \
sed -n '/[aeiouAEIOU]/{s/./echo -n "&"; sleep '"$vowel"';/p;b};
/[[:alpha:]]/{ s/./echo -n "&"; sleep '"$consonant"';/p;b};
/^$/{s/^$/echo;/p;b};
/"/{s/"/echo -n "\\\x22"; sleep 0.1;/p;b};
s/./echo -n "&"; sleep 0.1 ;/p')
}
测试:
time slowecho hello there
输出:
hello there
real 0m2.085s
user 0m0.000s
sys 0m0.028s
变量可以动态设置,因此也适用:
vowel=3 consonant=5
time slowecho hello
输出:
hello
real 0m21.030s
user 0m0.004s
sys 0m0.020s
注意:在处理&#39; &#34; &#39;&#39; &#34; &#39;时,无需设置vowel="; sleep 0.17", just the number is sufficient. The
sed`代码有点难看。和&#39; \ n &#39;,每个人都需要自己的一行。也许有更好的方式......
为了好玩,请尝试slowecho $(fortune)
。