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

Processing variables inside string from file

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

$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,它只是打印“$date”。 从我的测试来看,eval 似乎适用于我在程序中定义的其他数组,日志数组除外,所以我有点卡住了!

更改此行:

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"

以防止对结果进行额外的分词和通配。