首页 > 解决方案 > 在 Bash 中分配变量时如何替换“eval”

问题描述

我有一个函数myFunction(),它应该从外部获取一个整数变量,打印它然后递增它。

这有效:

myFunction
myFunction() {
    local var="${1}"
    eval "printf '%s\n' \$$var"
    eval "$var=$(($var+1))"
}

但是,我不想eval在此使用,因为此函数的用户可能会输入错误的变量名,然后可能会执行该变量名。我想使用类似的东西,printf -v因为它会使使用更安全。

我怎样才能做到这一点?

标签: bashfunctioneval

解决方案


如果您乐于枚举所有可能的变量名,您可以(仅?)在没有 eval 的情况下执行此操作。

myFunction () {
  case $1 in
  (frobme)    printf '%s\n' $frobme; : $((++frobme));;
  (zapme)     printf '%s\n' $zapme;  : $((++zapme));;
  (*)         printf 'invalid name: %s\n' "$1" >&2;;
  esac
}

推荐阅读