【问题标题】:how to read data from a file in shell script如何在shell脚本中从文件中读取数据
【发布时间】:2013-02-19 10:54:22
【问题描述】:

我有两个 shell 脚本文件 test1.sh 和 test2.sh 。我还有另一个名为 translogs.txt 的文件。
现在我需要将 test1.sh 中的两个变量的值复制到 translog.txt 中,并且需要将相同的变量复制到 test2.sh 中的对应值中。

test1.sh

#!/bin/sh
ONE="000012"
TIME="2013-02-19 15:31:06"
echo -e "$ONE\n$TIME">translog.txt;

translog.txt

ONE="000012"
TIME="2013-02-19 15:31:06"

但是在 test2.sh 中,我想要与 translog.txt 中相同的值到相应的变量

test2.sh

#!/bin/sh
ONE="000012"
TIME="2013-02-19 15:31:06"

【问题讨论】:

  • 我已经准备好我们的问题 3 次了,但仍然对你到底想要完成什么感到困惑......也许显示一个之前和之后以及你目前尝试做的方式?
  • 我已经实现了这个 test1.sh 和 translog.txt 但我需要相应地从 translog.txt 到 test2.sh 获取值
  • 据我了解,您想从 test2.sh 中读取 translog.txt 中的脚本值?
  • 我需要将 translog.txt 中的相同值分配给 test2.sh 中的相同变量
  • @Blazej Kroll,是的,我需要读取 test2.sh 的值

标签: shell


【解决方案1】:

1 干溶液

$> cat translog.txt
ONE="000012"
TIME="2013-02-19 15:31:06"

使用perl 正则表达式grep 可以使用lookbehind 运算符匹配这些值。

$> grep --only-matching --perl-regex "(?<=ONE\=).*" translog.txt
"000012"

对于TIME

$> grep --only-matching --perl-regex "(?<=TIME\=).*" translog.txt
"2013-02-19 15:31:06"

因此,使用 test2.sh 脚本,您可以像这样使用它:

#!/bin/bash
ONE=`grep --only-matching --perl-regex "(?<=ONE\=).*" translog.txt`
TIME=`grep --only-matching --perl-regex "(?<=TIME\=).*" translog.txt`

2 命令行解决方案

以下链接之一中指出的另一种解决方案是使用: source(又名.)命令将文件中的所有变量加载到当前shell中:

$ source translog.txt

现在您可以访问文件中定义的变量的值了:

$ echo $TIME
"2013-02-19 15:31:06"

3 最简单​​的解决方案

@user2086768 提到了另一种方法。将这些行放到`test2.sh:

#!/bin/bash
eval $(cat translog.txt)

因此,您将在 test2.sh 脚本中分配两个变量:

ONE="000012"
TIME="2013-02-19 15:31:06"

您可以轻松检查是否添加:

echo $ONE
echo $TIME

也检查这些链接:

【讨论】:

  • @StevenPenny 我不喜欢复制和粘贴别人的答案。不过,我会编辑以提供更多详细信息。
  • @BlazejKroll 我收到此错误:grep: ./home/db-backup/translogs.txt: No such file or directory 即使我编写了正确的代码。
  • @Vishu 现在试试,我删除了脚本中不必要的点。
  • @Vishu 我假设您正在从放置 translogs.txt 的目录运行脚本。如果没有,请将 translog.txt 文件的正确路径放在其前面,例如: grep --only-matching --perl-regex "(?
  • @BlazejKroll 执行脚本时挂起
【解决方案2】:

由于translog.txt 是有效的 bash 代码,您可以这样做:

source translog.txt

test2.shONETWO 将在 test2.sh 中可用。

提醒一句,如果 ONETWO 的值来自不受信任的来源,这确实会让您面临 shell 脚本注入攻击。

【讨论】:

    【解决方案3】:

    如果你的 translog.txt 如你所说,那么这将起作用

    #!/bin/sh
    while read aa
    do
      eval "$aa"
    done < translog.txt
    

    【讨论】:

    • 它不工作......我在第 5 行得到了这个错误 command not found
    【解决方案4】:

    eval 应该适合你。

    尝试使用这个版本的test2.sh:

    test2.sh

    #!/bin/bash
    eval $(cat translog.txt)
    echo $ONE
    echo $TIME
    

    这个输出:

    000012

    2013-02-19 15:31:06

    【讨论】:

    • @Vishu:文件的正确名称是什么? translogs.txt 还是 translog.txt?
    猜你喜欢
    • 2016-07-25
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2017-09-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多