在 bash 脚本中使用 awk 和 if

在 bash 脚本中使用 awk 和 if

我正在编写一个脚本,其中需要测试一个字符串,并根据其结果决定是否继续。

下面的命令运行正常(如果字符串以“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

你应该使用沃姆布尔的建议,因为它不需要产生单独的过程。

相关内容