如何在echo语句中的每个字符之后为整个脚本注入变量

时间:2016-08-05 16:02:07

标签: bash shell unix

请不要给我一个直接的解决方案,我试图学习如何做到这一点只是为了好玩,你们能指出我正确的方向吗?

我想创建一个可以应用于我的脚本的小设备或功能。如果我有以下变量:

Vowel=; sleep 0.17
Consonant=; sleep 0.21

如何设置函数或循环以实现以下效果?

  • 对于"中的每个角色; "脚本中每个echo命令的一部分......
  • 创建一个新的" echo -n" "与" "部分只存储第一个字符......
  • 然后,根据角色是元音还是辅音来放置元音变量或辅音变量......
  • 执行此操作直到echo命令中的最后一个字符

以上功能或脚本需要......

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 

3 个答案:

答案 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)

你需要这些: (如果您需要完整的灰色字段提示,它们会在我的桌面上显示。. . .表示您需要自己弄清楚这部分。)

  1. 地图,如果字符是元音或辅音,它将保留信息。您可以使用一个关联数组,其中字母为键,值为CONSONANT(C)或VOWEL(V)。

    declare . . . map #declaration of associative array map

    map=( . . . . . . )#填充值

  2. 源阅读器,您将通过输入提供。这可以是一种功能。

    while read . . . . .; . . . . . . .; done < <(. . . . .)

  3. 翻译将所需内容转化为想要的内容。

    ${. . . . .} #decode字符c的值。请记住,有大写字母和大写字母。最重要的是,注入你喜欢的东西。

  4. 打包将所有内容四舍五入,让外界轻松访问。您可能只希望它是一个可扩展的函数,或者您可能希望它是一个以单词作为参数的脚本。您可能还希望它能够从管道或交互式读取标准输入。另一个功能是读取作为参数传递的文件。最后,您可能希望赋予它写入功能,这将使用输出填充新旧文件。

  5. 参考:

答案 2 :(得分:0)

使用evalsed代码转换字母等功能 各种延迟,加上一些变量:

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)