在bash脚本中用awk使用awk

我正在做一个脚本,其中我需要testing一个string,并根据其结果,我会决定如果我走得更远或不。

下面的命令工作正常(如果string以“清洁”开始,它将打印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”,但第二个“回声”不打印任何东西,当然,如果不起作用。

谁能帮我?

TIA,

短发

Awk在这里是错误的解决scheme。 怎么样:

 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;; 或类似的)IMAO没有太大的帮助。 如果你想要一个条件,使用一个if ,我说。

Womble的答案可能是我会去的,但你也可以使用grep:

 if echo cleanarf | grep -qi '^clean'; then echo foo fi 

如果你希望区分大小写(或者如果你不想不区分大小写:-p),把i开关放到grep中。

在你的第一个例子中,你使用echo来为awk提供一个文件( stdin ),但是在你的脚本中没有awk需要处理的文件,并且等待input“挂起”。 你可以在$()中的variables赋值中使用echo ,但是我更喜欢使用/dev/null来实现这个目的(即当没有实际的文件进行处理时)。

为了避免尴尬的引用,可以使用带-v选项的variables传递给awk脚本提供Bashvariables。

你会发现这个工作:

 idx=$(awk -v task="$task" '{print index(task, "Clean")}' /dev/null) echo $idx if [ "$idx" == "0" ]; then echo hello fi 

不过,你应该使用womble的build议,因为它不需要产生一个单独的过程。