我正在做一个脚本,其中我需要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议,因为它不需要产生一个单独的过程。