I need as short as possible bash test command (bracket test) to evaluate result of piped grep with variable as search argument. I am testing, whether a new string is in the array – piping the array contents as lines to grep and checking exit code. But it somehow does not work. Does not find the value in the array. I have tried in various ways brackets, parenthesis, quotes, semicolons with no luck.
What is wrong here?
#! /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 ;}
Basically I want to understand the if…then construct versus the brackets test. The if…then method works:
if !( printf '%s\n' "${startLineNrs[@]}" | grep -xq "${startLineNr}" ); then startLineNrs+=("$startLineNr") ; fi
Best Answer
To make the
&&
--||
command work, try:Notes:
The test command (
[
) and the command substitution ($(...)
) are not needed.A subtlety of the construct
a && b || c
is thatc
will be executed not just ifa
fails but also ifb
fails. Since yourb
consists ofecho
statements which should normally succeed, this should not normally be a problem.For other methods for testing array membership, see "Check if a Bash array contains a value".