我正在编写一个脚本,其中需要测试一个字符串,并根据其结果决定是否继续。
下面的命令运行正常(如果字符串以“Clean”开头,它将打印 1,否则打印 0)。
echo | awk ' {print index("'"${task}"'", "Clean")}'
我正在尝试在 BASH 脚本中使用带有 IF 的 AWK。基于此邮政我做了以下事情:
idx=$(awk '{print index("'"${task}"'", "Clean")}')
echo $idx
if [ "$idx" == "0" ]; then
echo hello
fi
正如我所说,当我运行脚本时它会打印“0”,但第二个“echo”没有打印任何内容,当然 if 也不起作用。
谁能帮我?
短暂性脑缺血发作,
鲍勃
答案1
awk 是错误的解决方案。那么如何:
if [[ "$task" =~ ^Clean ]]; then
echo hello
fi
还有一种巧妙的替代方法:
if [ "${task/#Clean/}" != "$task" ]; then
echo hello
fi
但我发现它的可读性很差。
克里斯认为情况更整洁......让我们尝试一下:
case $task in
Clean*)
echo hello
;;
esac
我的审美观念告诉我“千万不要用铃铛”,摆弄格式(Clean*) echo hello;;
或类似的东西)不会有太大帮助,在我看来。如果你想要一个条件,就用一个if
,我说。
答案2
Womble 的答案可能是我想要的,但你也可以使用 grep:
if echo cleanarf | grep -qi '^clean'; then
echo foo
fi
i
如果您希望它区分大小写(或者如果您不希望它不区分大小写:-p),请将开关放到 grep 上。
答案3
在您的第一个示例中,您使用echo
来提供awk
文件(stdin
),但在您的脚本中,没有要awk
处理的文件,并且它“挂起”等待输入。您可以echo
在 中的变量赋值中使用$()
,但我更喜欢为此目的使用/dev/null
(即当没有实际文件要处理时)。
为了避免尴尬的引用,您可以使用变量传递并选择-v
向脚本提供 Bash 变量awk
。
你应该发现这是有效的:
idx=$(awk -v task="$task" '{print index(task, "Clean")}' /dev/null)
echo $idx
if [ "$idx" == "0" ]; then
echo hello
fi
你应该使用沃姆布尔的建议,因为它不需要产生单独的过程。