linux - 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
--------------------------
解决方案
推荐阅读
- python - 插入图像 tkinter
- python - 如何使用子进程来完成复杂的交互式 shell 脚本
- react-native - 如何解决这个问题?navigation.navigate 不是函数
- typescript - 打字稿不能扩展 Autodesk.Viewing.ToolInterface
- android - Flutter 仅在设备 (Android) 连接时在后台运行(屏幕关闭)
- hyperledger-fabric - 文件包含 goimports 错误
- r - 为什么 stat_compare_means 只在一个方面显示成对比较?
- mysql - 从选择 Laravel 中选择
- python - 将 varchar 值“无”转换为数据类型 int.DB-Lib 时转换失败
- python - SQLite 获取直到