在我的bash脚本中,我试图解析状态文件并根据某些关键字检测错误。我将这些前缀存储在一个列表中,然后遍历它们。
Bash脚本:
status_page="/path/to/file.txt"
list="aaa bbb ccc ddd"
for pre in $list
do
echo "grep '\w\w\w${pre}-.*\.lin failed' ${status_page}" # debug
if grep '\w\w\w${pre}-.*\.lin failed' ${status_page}; then
echo "Found error!"
exit 8;
fi
done
/path/to/file.txt:
xyzfff-tool.lin failed
xyzggg-exec.lin failed
rstccc-tool.lin failed
bash脚本应该捕获行rstccc-tool.lin failed
,但它会跳过它。
对于调试,我逐字打印grep命令,当我复制该行并在我的shell(tcsh)中发出命令时,它返回该行......
外壳:
$ grep '\w\w\wccc-.*\.lin failed' /path/to/file.txt
rstccc-tool.lin failed
$ echo $?
0
如果我在正常发出命令时grep可以找到该行,那么当bash脚本调用grep时它怎么会找不到呢?
答案 0 :(得分:6)
该变量不会在单引号中展开。尝试使用双引号:
if grep "\w\w\w${pre}-.*\.lin failed" "${status_page}"; then
答案 1 :(得分:2)
该脚本的$ {pre}部分未正确解析它。我相信你需要这句话来说:
if grep '\w\w\w'${pre}'-.*\.lin failed' ${status_page}; then
... $ {pre}在引号之外,这样bash会在将它发送给grep之前进行正确的字符串替换。