所以我试图从像这样的文件中获取一些系统日志。
$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似乎可以在我在程序中定义的其他数组上工作,除了日志数组,所以我有点卡住了!
答案 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
字符串中。
使用eval
和echo
时,您还应引用该变量:
eval "$cmd"
echo "$cmd"
防止额外的单词拆分和结果的全局化。