运行我的简单shell脚本时遇到问题,我在使用while循环读取文本文件并尝试使用匹配的regexp检查条件:
#!/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
你可以告诉我吗?
答案 0 :(得分:3)
[[ expr ]]
是一种抨击; sh没有它。
如果您想使用该语法,请使用#!/bin/bash
。
Awk已经完成了你在这里所做的一切 - 你只需要利用Awk的内置正则表达式匹配以及每行多个动作的能力:
您的原始脚本可以简化为此命令:
awk '/^sometext/ {print $1; next} {print}' input.txt >> output.txt
如果模式匹配,Awk将运行第一个{}
- 块,执行print $1
,然后强制Awk移动到下一行。否则,它将继续到第二个{}
- 块,它只打印该行。
答案 1 :(得分:2)
因为您在/bin/sh
使用shebang而[[
只能在BASH中使用。
将shebang更改为/bin/bash
顺便说一句,你的脚本可以用简单的awk完全处理,你不需要在awk
循环中使用while
。
答案 2 :(得分:1)
sh
不支持双括号语法 - 明确是bash
- ism。
尝试将shebang行更改为#!/bin/bash