3

我在运行我的简单 shell 脚本时遇到问题,我在其中使用 while 循环读取文本文件并尝试使用匹配的正则表达式检查条件:

#!/bin/sh
regex="^sometext"


cat input.txt | 
{
  while read string
    do if [[ $string ~= $regex ]]; then
            echo "$string" | awk '{print $1}' >> output.txt
       else
            echo "$string" >> outfile.txt
       fi
    done
}

但我只收到类似的错误

[[: not found

你能告诉我吗?

4

3 回答 3

3

[[ expr ]]是一种 bash 主义;sh没有。

#!/bin/bash如果您想使用该语法,请使用。


也就是说,为什么要使用 shell 脚本?

awk 已经可以完成你在这里所做的一切——你只需要利用 awk 的内置正则表达式匹配和每行有多个操作的能力:

您的原始脚本可以简化为以下命令:

awk '/^sometext/ {print $1; next} {print}' input.txt >> output.txt

如果模式匹配,Awk 将运行第一个{}-block,它执行 aprint $1然后强制 Awk 移动到下一行。否则,它将继续到第二个{}块,它只打印该行。

于 2013-10-30T17:34:03.687 回答
2

因为您使用 shebang/bin/sh并且[[仅在 BASH 中可用。

将 shebang 更改为/bin/bash

顺便说一句,您的脚本可以在简单的 awk 中完全处理,您不需要在此处awkwhile循环内使用。

于 2013-10-30T17:33:40.297 回答
1

sh不支持双括号语法 - 这显然是一个bash-ism。

尝试将您的 shebang 线更改为#!/bin/bash

于 2013-10-30T17:34:33.817 回答