2

在我的 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时找不到它?

4

2 回答 2

6

该变量不会在单引号中展开。尝试使用双引号:

if grep "\w\w\w${pre}-.*\.lin failed" "${status_page}"; then
于 2013-09-05T17:32:03.923 回答
2

该脚本的 ${pre} 部分未正确解析它。我相信你需要那句话说:

if grep '\w\w\w'${pre}'-.*\.lin failed' ${status_page}; then

... ${pre} 在引号之外,这样 bash 将在将其发送到 grep 之前进行正确的字符串替换。

于 2013-09-05T17:40:12.763 回答