从文件处理字符串中的变量

时间:2018-01-23 10:35:10

标签: arrays bash eval

所以我试图从像这样的文件中获取一些系统日志。

$date  INT-FW01 : %ASA-6-106100: access-list inside denied udp inside/172.29.2.101(1039) -> outside/192.203.230.10(53) hit-cnt 1 first hit [0xd820e56a, 0x0]

我将替换从文件中获取并存储在数组中的各个日志的时间戳和IP地址。 这是我的代码:

#!/bin/bash
file=log_store
gen_ip() {
        echo $((RANDOM%256)).$((RANDOM%256)).$((RANDOM%256)).$((RANDOM%256))
}
timestamp() {
        date +"%b %d %H:%M:%S"
}
ip=$(gen_ip)
date=$(timestamp)
if [ -e $file ];  then
        readarray -t logs < $file
else
        echo "$file is not present"
fi

cmd='cmd=${logs[0]}'
eval $cmd
echo $cmd

此代码似乎回显了第一个数组项,但它不是从文件中替换$ date,它只是打印&#34; $ date&#34;。 从我的测试来看,eval似乎可以在我在程序中定义的其他数组上工作,除了日志数组,所以我有点卡住了!

1 个答案:

答案 0 :(得分:1)

更改此行:

cmd='cmd=${logs[0]}'

为:

cmd="cmd=\"${logs[0]}\""

您的单引号阻止了${logs[0]}变量的扩展,因此$cmd包含字面意义。然后eval展开该变量,结果为$date。您需要第一次扩展,以便变量的值变为

cmd='$date  INT-FW01 : %ASA-6-106100: access-list inside denied udp inside/172.29.2.101(1039) -> outside/192.203.230.10(53) hit-cnt 1 first hit [0xd820e56a, 0x0]'

然后eval将展开$date变量。

你需要${logs[0]}左右的双引号,这样它就不会尝试将其余部分解析为shell命令,但仍会扩展其中的变量。它们必须被转义,以便它们可以放在cmd字符串中。

使用evalecho时,您还应引用该变量:

eval "$cmd"
echo "$cmd"

防止额外的单词拆分和结果的全局化。