首页 > 解决方案 > Unix和Linux ksh shell:当变量来自字符串加上另一个变量时,如何在CASE表达式中使用eval?

问题描述

于 2019 年 5 月 9 日更新,包括粘贴在最底部的完整且有效的解决方案。

原始问题: 首先,我在其他站点中到处搜索此站点的解决方案,但没有运气。

我正在尝试使用下面的 CASE 语句来正确评估我的自定义变量,该变量由字符串和计数变量连接在一起(例如 var_name="cell${i}")。当我回显自定义变量名称和值时,它们似乎是正确的。

问题是 CASE 语句没有正确评估自定义变量(请参阅输出),并且由于找不到匹配项而一直处于默认条件。我需要帮助来弄清楚如何正确评估我的 CASE 条件?下面是简单代码,实际代码下面是不同的失败变量初始化和案例语句,包括我得到的错误。

#!/bin/sh

cell1="one"
cell2="two"
cell3="three"

i=1
while [ $i -lt 4 ]
do
        var_name="cell${i}"
        echo "Variable name: ${var_name}"
        eval "echo Variable value: \$${var_name}"

        case \$${var_name} in                   #Falls to default case option because variable not evaluated correctly
                'one'|'two')
                        echo "Either one or two: " \$${var_name}
                        ;;
                'three')
                        echo "Only three: " \$${var_name}
                        ;;
                *)
                        echo "Failed"
                        ;;
        esac
        i=`expr $i + 1`
        echo "--------------------------"
done

#Failed variable initialization attempts
        #typeset -n var_name=cell${i}           #typeset: not found
        #echo "${!var_name}"                    #bad substitution

#Failed case usage attempts
        #case ${!var_name} in                   #bad substitution
        #case `eval echo "\$${var_name}"` in    #Falls to default case option because variable not evaluated correctly
        #case ${var_name} in                    #Falls to default case option because variable not evaluated correctly

我尝试对变量使用 typeset -n 以及 eval 和“\”和“$”的不同位置,以使这种情况条件正常工作,但没有运气。下面是当前输出,旁边是我的评论,解释了我期望看到的内容。

OUTPUT from shell script
--------------------------
Variable name: cell1
Variable value: one
Failed <-- Not being evaluated correctly since it is checking value of "cell1" instead of value "one" so fell into default case option
--------------------------
Variable name: cell2
Variable value: two
Failed <-- Not being evaluated correctly since it is checking value of "cell2" instead of value "two" so fell into default case option
--------------------------
Variable name: cell3
Variable value: three
Failed <-- Not being evaluated correctly for same reasons as above
--------------------------

工作解决方案:

#!/usr/bin/ksh

cell1="one"
cell2="two"
cell3="three"

i=1
while [ $i -lt 4 ]
do
        var_name="cell"$i
        #v=`eval echo ${!var_name}` #solution for bash
        v=`eval echo '$'${var_name}` #solution for ksh
        echo Variable name: \$${var_name}
        echo "Variable value: ${v}"

        case ${v} in
                'one'|'two')
                        echo "Either one or two: " \$${var_name}
                        ;;
                'three')
                        echo "Only three: " \$${var_name}
                        ;;
                *)
                        echo "Failed"
                        ;;
        esac
        i=`expr $i + 1`
        echo "--------------------------"
done

工作代码输出

Variable name: $cell1
Variable value: one
Either one or two:  $cell1
--------------------------
Variable name: $cell2
Variable value: two
Either one or two:  $cell2
--------------------------
Variable name: $cell3
Variable value: three
Only three:  $cell3
--------------------------

标签: linuxshellunixksh

解决方案


推荐阅读