我很难让它开始工作/知道是否可能。我正在使用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变量中的信息最终将在单独的脚本中,并且当我最终得到一个有效的模型时,将通过在该脚本中作为函数调用它来进行设置。 看来这是一个可行的主意,我对如何在不起作用的情况下调用变量一无所知。如果有人有任何想法,我将不胜感激。 预先谢谢你!
答案 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"