使用管道和变量测试 grep 退出状态失败

使用管道和变量测试 grep 退出状态失败

我需要尽可能短的 bash 测试命令(括号测试)来评估使用变量作为搜索参数的管道 grep 的结果。我正在测试数组中是否有新字符串 - 将数组内容作为行管道传输到 grep 并检查退出代码。但它不知何故不起作用。在数组中找不到值。我尝试了各种方法,包括括号、圆括号、引号、分号,但都没有成功。这里出了什么问题?

#! /bin/bash
startLineNrs=();
startLineNrs+=("45");
startLineNrs+=("280");
startLineNrs+=("80");
startLineNr="280";
echo "\$startLineNrs:" ${#startLineNrs[@]};
printf '%s\n' "${startLineNrs[@]}";
[ "$(printf '%s\n' ${startLineNrs[@]} | grep -xq ${startLineNr})" ] && { echo $?; echo Found ;} || { echo $?; echo Not found ;}

基本上,我想了解 if...then 构造与括号测试。 if...then 方法的工作原理:

if !( printf '%s\n' "${startLineNrs[@]}" | grep -xq "${startLineNr}" ); then startLineNrs+=("$startLineNr") ; fi

答案1

为了使&&--||命令起作用,请尝试:

printf '%s\n' ${startLineNrs[@]} | grep -xq ${startLineNr}  && { echo $?; echo Found ;} || { echo $?; echo Not found ;}

笔记:

  1. 不需要测试命令([)和命令替换( )。$(...)

  2. 该构造的一个微妙之处a && b || c在于,c不仅会在a失败时执行,还会在b失败时执行。由于您的b语句echo通常应该成功,因此这通常不会成为问题。

  3. 有关测试数组成员资格的其他方法,请参阅“检查 Bash 数组是否包含某个值”

答案2

编写 if 语句的正确方法是:

if printf '%s\n' "${startLineNrs[@]}" | grep -xq "$startLineNr"; then
  # your logic
fi

您的测试语句的问题[...]是,[test将其"$(printf '%s\n' ${startLineNrs[@]} | grep -xq ${startLineNr})视为字符串,并且不会将其作为命令替换运行。由于它是一个非空字符串,因此它始终会评估为 true。

相关内容