处理文件中字符串内的变量
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
字符串中。
在使用eval
和echo
时也应该引用变量:
eval "$cmd"
echo "$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]
我将替换从文件中获取并存储在数组中的各个日志的时间戳和 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
字符串中。
在使用eval
和echo
时也应该引用变量:
eval "$cmd"
echo "$cmd"
以防止对结果进行额外的分词和通配。