5

我有一个脚本需要多次评估用户输入,我正在研究的解决方案是将评估位放入一个函数中,并且每次我需要评估输入时只需调用该函数。问题是,当我尝试更新$1变量(引用函数的第一个变量参数)时,我收到错误消息“$VARIABLE command not found”。

这是代码:

function input_handler() {
 if is_integer $1; then
  selid="$1 -1"
  if [[ "$1" -le "0" ]]; then
   echo "Please use a simple positive number!"
  else
   if [[ "$1" -le "${#array[*]}" ]]; then
    eval $1="${array[selid]}"
    echo "Ok, moving on..."
   else
    echo "That number seems too large, try again?"
   fi
  fi
 else
  if [ -e $2/$1 ]; then
   echo "Ok, moving on..."
  else
   echo "That item is not on the list, try again!"
  fi
 fi
}

这个命令:

input_handler $doctype $docpath

给出这个输出:

5
./test: line 38: 5=sun: command not found

好吧,继续……

现在这几乎是正确的,但我之后是 doctype=sun,而不是 5=sun,换句话说,我需要$1变量名而不是它的值。更改线路eval $1="${array[selid]}"eval doctype="${array[selid]}"修复此特定实例。但这并不能解决我的问题,因为我需要在具有不同名称的不同变量上运行此函数。

4

4 回答 4

4

也许不完全理解您想要实现的目标,但请查看下一个示例:

weirdfunc () {
    echo " weirdfunc: variable name is: $1"
    echo " weirdfunc: variable value is: ${!1}"
    eval "$1=$(( ${!1} + 1))" #assign
}

myvar="5"
echo "the value of myvar before: $myvar"

weirdfunc myvar #call with the NAME not with the value, so NOT weridfunc $myvar

echo "the value of myvar after: $myvar"

简而言之 - 当你想在被调用函数中对变量NAME做任何事情时,你应该传递变量的 NAME 而不是他的值。所以调用函数

somefunc NAME

代替

somefunc $NAME

并使用上述构造来获取函数内部的名称和值。

于 2013-04-21T13:49:53.613 回答
0

如果您保护变量名,Bash 将评估并分配给 $1,而不是尝试执行 $1=value。

eval "$1"=${array[selid]}
于 2013-04-21T14:25:37.737 回答
0

您无法$1使用传统赋值更新 的值,但可以使用set内置函数更新位置参数。

$ f() { echo "$@"; set -- a b c; echo "$@"; echo $2; }
$ f 1 2 3
1 2 3
a b c
b

请记住,这将清除您每次未重新设置的所有位置参数,因此$2如果您想保留它,则需要进行设置。

您最好的选择可能是将位置参数中的值分配给名称,然后只使用名称。

于 2013-04-21T13:48:38.717 回答
-1

位置参数是只读的。所以你想做的事情是不可能的。你应该做类似的事情

foo=$1

然后使用$foo而不是$1

于 2013-04-21T13:05:07.443 回答