【问题标题】:ksh: shell eval function output same count after insertksh:插入后shell eval函数输出相同的计数
【发布时间】:2013-11-15 12:09:07
【问题描述】:

我正在尝试将我的 ksh 脚本代码放入变量中,以便稍后使用 eval 执行它

示例虚拟脚本逻辑

============================

my_command=$(cat

###//function count  records in database table

record_before=$(count_records $table_name)

###//function inserting record to database table

insert_records $table_name

###//function count  records in database table after insert

record_after=$(count_records $table_name)

EOF)

============

eval "$my_command"

问题是,如果我仍然插入一条记录,record_before 和 record_after 仍然包含相同数量的记录。 例子: 表有 1 条记录。 记录之前 =1 插入新记录表现在有 2 条记录 record_after=1

record_after 应该有 2 条记录而不是 1 条

有什么建议吗?

* 已解决 * 您应该在执行的函数周围加上单引号以在 EVAL 中正常工作

record_before='$(count_records $table_name)'

record_after='$(count_records $table_name)'

发现了一些新的东西,以避免引用我现在使用的代码

var=$(CAT

【问题讨论】:

  • 嗯,我想我刚刚发现问题出在哪里:record_before='$(count_records $table_name)',我应该在调用函数周围加上单引号
  • 你真的不想以这种方式使用cat。除非您包含单引号,否则变量扩展发生在 eval 之前。
  • 不要忘记在insert_records 行中引用$table_name。否则,在您的环境中更改table_name 然后evaling 将无法正常工作。你真的应该为此使用 shell 函数。
  • 好的,所以问题似乎出在使用的 cat 函数中 - 它在 eval 中执行变量之前提取变量,您能否建议如何使用 my_var=
  • 你为什么不使用 shell 函数呢?

标签: shell unix eval ksh


【解决方案1】:

您可以简单地将脚本直接分配给变量。 shell 语言允许多行字符串,无需任何特殊语法。

my_command='count_records $table_name
insert_records $table_name
count_records $table_name'

如果你回显"$my_command",你会得到你所期望的。使用带有eval 的字符串也可以。话虽如此,我会使用 shell 函数而不是评估字符串来编写它。

update_table() {
    table_name=$1
    count_records $table_name
    insert_records $table_name
    count_records $table_name
}

# "call" the function just like it was any other command
update_table tablename

根据您这样做的原因,您可以将函数插入到 shell 库中的某处并将 source 插入脚本中,或者将函数添加到您的 $HOME/.profile(或 $HOME/.kshrc)和 update_table 中在您的 shell 环境中可用。

【讨论】:

  • 好的,谢谢。可能它也可以工作,但在我存储到变量代码的情况下,我有很多不同的引号,比如: ' , " , ` 。然后我的代码周围只有单引号将不起作用
  • 那么不要将 code 存储在变量中。这就是发明 shell 函数的原因。它们让您只需编写 shell 代码,而不必担心转义引号。
猜你喜欢
  • 2011-02-15
  • 2011-11-25
  • 2021-07-21
  • 1970-01-01
  • 2011-01-29
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
相关资源
最近更新 更多