#!/bin/bash
testFunction () {
read -p "Question" $1
echo $1
}
testFunction foo
我的目的是读取将用户输入分配给参数中的变量,然后将其回显,然而不是回显用户输入,而是回显foo
。
我意识到要解决这个问题,我可以这样使用Bash indirection:
#!/bin/bash
testFunction () {
read -p "Question" $1
echo ${!1}
}
testFunction foo
但是,我宁愿避免使用这种方法,因为并非所有语言都有可变间接(我将很快转向一种新语言)。有没有其他方法可以让它看看foo
,好像它是一个变量?感谢。
答案 0 :(得分:2)
在任何具有类似eval
的构造的语言中,可以将字符串解释为变量名。在Bash:
eval echo \$$foo
在Python中:
from __future__ import print_function
eval ( "print (" + foo + ")" )
在大多数缺少eval
的语言中,这是不可能的。
答案 1 :(得分:0)
这就是我要做的事情(基于你的评论):
testFunction () {
read -p "yes or no? [YynN] " bla
if [ "$bla" = 'Y' -o "$bla" = 'y' ]; then
return 0
fi
return 1
}
if testFunction; then
echo "it was yes"
fi
或
testFunction () {
read -p "yes or no? [YynN] " bla
if [ "$bla" = 'Y' -o "$bla" = 'y' ]; then
echo 1
else
echo 0
fi
}
foo=`testFunction`
echo $foo
答案 2 :(得分:0)
您可以使用eval
testFunction () {
eval 'read -p "Enter Y or N: " '$1
eval 'echo $'$1
}
testFunction foo
但eval
不是一个可以轻易使用的工具。你在做什么可能是疯了。你应该使用像这样的方法
testFunction () {
read -p "Enter Y or N: " bar
case "$bar" in
[YyNn]) return 0 ;;
esac
return 1
}
testFunction && foo=valid
这样您以后就不必重新检查$foo
,它的值是对“输入有效吗?”这个问题的回答。
但是,稍后您可能希望根据用户是否说y
或n
来实际做出不同的事情,我怀疑是什么驱使这个“让我们从一个函数动态创建一个变量”废话。在这种情况下,您可以执行类似
testFunction () {
read -p "Enter Yes or No: " bar
case "$bar" in
[Yy][Ee][Ss]|[Yy]) printf y ;;
[Nn][Oo]|[Nn]) printf n ;;
esac
}
foo=$(testFunction)
这在功能上类似于eval
版本,但它确保您只将已知值传入foo
。稍后您可以在foo
中测试值。
if [ -z "$foo" ] ; then
echo invalid input
elif [ "$foo" = "y" ] ; then
echo answered yes
elif [ "$foo" = "n" ] ; then
echo answered no
fi
您可以保持此代码简单,因为所有可能的值都已知。