Bash脚本变量不是字符串

时间:2011-09-10 08:32:00

标签: string bash variables

#!/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,好像它是一个变量?感谢。

3 个答案:

答案 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,它的值是对“输入有效吗?”这个问题的回答。

但是,稍后您可能希望根据用户是否说yn来实际做出不同的事情,我怀疑是什么驱使这个“让我们从一个函数动态创建一个变量”废话。在这种情况下,您可以执行类似

的操作
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

您可以保持此代码简单,因为所有可能的值都已知。

相关问题