我需要尽可能短的 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 ;}
笔记:
不需要测试命令(
[
)和命令替换( )。$(...)
该构造的一个微妙之处
a && b || c
在于,c
不仅会在a
失败时执行,还会在b
失败时执行。由于您的b
语句echo
通常应该成功,因此这通常不会成为问题。有关测试数组成员资格的其他方法,请参阅“检查 Bash 数组是否包含某个值”。
答案2
编写 if 语句的正确方法是:
if printf '%s\n' "${startLineNrs[@]}" | grep -xq "$startLineNr"; then
# your logic
fi
您的测试语句的问题[...]
是,[
或test
将其"$(printf '%s\n' ${startLineNrs[@]} | grep -xq ${startLineNr})
视为字符串,并且不会将其作为命令替换运行。由于它是一个非空字符串,因此它始终会评估为 true。