将while true循环加载到变量中

时间:2018-09-08 17:17:09

标签: bash

我很难让它开始工作/知道是否可能。我正在使用bash以外的其他工具来创建游戏,这需要大量重复的case语句。我试图将所有重复的case语句加载到一个变量中,然后在必要时重复它们,以限制更新不同脚本之间的共享case语句所需的工作量。 这是我所拥有的:

#!/bin/bash

moo="[m][o][o]) echo 'thank you for following instructions' ;;"

test=$(echo "while true ; do
read -p 'type moo: ' case
case $case in
$moo
*) echo 'type moo please'
esac
done")

"$test"

我遇到的问题是:

./case.sh: line 13: $'while true ; do\nread -p \'type moo: \' case\ncase  in\n[m][o][o]) echo \'thank you for following instructions\' ;;\n*) echo \'type moo please\' ;;\nesac\ndone': command not found

moo变量中的信息最终将在单独的脚本中,并且当我最终得到一个有效的模型时,将通过在该脚本中作为函数调用它来进行设置。 看来这是一个可行的主意,我对如何在不起作用的情况下调用变量一无所知。如果有人有任何想法,我将不胜感激。 预先谢谢你!

1 个答案:

答案 0 :(得分:1)

这不起作用,因为引号使变量扩展被视为一个单词。

但是它也不能不带引号,因为外壳程序不会解析分号和换行符之类的语法的变量输出。在命令解析的该阶段之后完成变量扩展。对扩展变量进行的唯一处理是单词拆分和通配符匹配。

您需要使用eval来执行所有命令解析:

eval "$test"

另一个问题是,在分配变量$case时,变量test会被扩展,而不会得到read所读取的值。由于该变量尚无值,因此将其执行为:

case in ...

,这是无效的语法。您需要转义$,以便从字面上传递它。

也不需要echo,您只需直接分配字符串即可。

test="while true ; do
read -p 'type moo: ' case
case \$case in
$moo
*) echo 'type moo please'
esac
done"