bash script else block not working in Airflow [duplicate] - bash

This question already has answers here:
Why should there be spaces around '[' and ']' in Bash?
(5 answers)
Closed 27 days ago.
I tried to implement the if else condition in Airflow, if a condition is true then statements under this condition will execute. In the else part the statements will not execute and return the task as failed
"a=0;"
"if [[$a -ge "1"]] ; then"
" echo 'Job Success';"
"else "
" echo 'Need Investigation';"
" exit 0;"
"fi;"
Here, If a is equal to 1 then the echo statement 'Job Success' is printed
If a is equal to 0 then the echo statement is not printed and the respective Airflow Dag is marked as failed

The [[ is a shell command (technically, a keyword) and requires whitespace between it and its arguments. You might be seeing an error [[0: command not found.
Also, the "inner" quotes aren't escaped (bash doesn't need them here):
"if [[ $a -ge 1 ]]; then"

Related

How to only accept input that is a valid index of an array in bash [duplicate]

This question already has answers here:
Why should there be spaces around '[' and ']' in Bash?
(5 answers)
Difference between single and double square brackets in Bash
(7 answers)
Why is "[[ 10 < 2 ]]" true when comparing numbers in bash? [duplicate]
(1 answer)
Closed 6 months ago.
I am trying some simple input validation in bash. Basically this part of my script outputs "press [index] to select [array element]." However I cannot seem to get it to stop and exit gracefully when an invalid input is entered. From my research so far this SHOULD work:
declare -a scenarios=()
scenarios+=("Scenario_123")
scenarios+=("Scenario_456")
scenarios+=("Scenario_789")
for i in ${!scenarios[#]}; do
echo -e "select $i for ${scenarios[$i]}"
done
read ScenInd
echo ${#scenarios[#]} #[${ScenInd}=~^[0-9]+$, =~ ^[[:digit:]]+
if ! [${ScenInd}=~ ^[[:digit:]]+$ ] || [${ScenInd} < 0] || [${ScenInd} >= ${#scenarios[#]}];
then
echo "INVALID SELECTION"
exit
fi
but when I run it and enter 8, I get '[8=~: command not found'
What have I done wrong and how do I fix this? I have tried this both with [${ScenInd}=~^[0-9]+$ and =~ ^[[:digit:]]+ yet the results are the same.
Thanks in advance

Bash program exits when it runs no matter what [duplicate]

This question already has answers here:
Why equal to operator does not work if it is not surrounded by space?
(4 answers)
Why is [ "$foo"=="$bar" ] always true in bash? [duplicate]
(1 answer)
Closed 3 years ago.
I'm trying to have the script exit if the user enters 'q'
here's the code:
echo "Enter Choice => "
read target
if [[ $target=='q' ]]; then
exit 1
else
#do something
fi
However when I run it no matter what the input is, the script exits...
#!/bin/bash
echo "Enter Choice => "
read target
if [[ $target == 'q' ]]; then
exit 1
else
#do something
echo "do something..."
fi
~
Try this - spacing between the tokens $target, '==' and 'q' is important.

"[0: command not found" in Bash [duplicate]

This question already has answers here:
How to use double or single brackets, parentheses, curly braces
(9 answers)
Why should there be spaces around '[' and ']' in Bash?
(5 answers)
Command not found error in Bash variable assignment
(5 answers)
Closed 5 years ago.
I am trying to get the array in the while-loop and need to update the value in array too.
Below is my code what I have tried. I get this error [0: command not found
#!/bin/bash
i=0
while [$i -le "{#myarray[#]}" ]
do
echo "Welcome $i times"
i= $(($i+1)))
done
How do I fix this?
Need a space after [ and no space before or after = in the assignment. $(($i+1))) would try to execute the output of the ((...)) expression and I am sure that's not what you want. Also, you are missing a $ before the array name.
With these things corrected, your while loop would be:
#!/bin/bash
i=0
while [ "$i" -le "${#myarray[#]}" ]
do
echo "Welcome $i times"
i=$((i + 1))
done
i=$((i + 1)) can also be written as ((i++))
it is always better to enclose variables in double quotes inside [ ... ]
check your script through shellcheck - you can catch most basic issues there
See also:
Why should there be a space after '[' and before ']' in Bash?
How to use double or single brackets, parentheses, curly braces
Command not found error in Bash variable assignment
Using [ ] vs [[ ]] in a Bash if statement

bash script if and while conditions [duplicate]

This question already has answers here:
Why should there be spaces around '[' and ']' in Bash?
(5 answers)
Closed 6 years ago.
I am having trouble with executing the following bash script:
#!/bin/bash
response=" "
while ["$response" != "q"]; do
echo -n "Please enter a response"; read response
done
ALSO
!/bin/bash
response="x"
if ["$response" = "x"]
then
echo "the value is x"
fi
What could the possible errors be?
Your while and if statements are spaced wrong.
while [ "$response" != "q" ]; do etc
You need a space between the bracket and the double quote.

input vs variable comparison isn't working? [duplicate]

This question already has answers here:
How do I compare two string variables in an 'if' statement in Bash? [duplicate]
(12 answers)
Closed 6 years ago.
Here is a random number generator followed by a line clear timer and you are then to try and input the number that you saw. I cant seem to set up the comparison between the randNum variable and the input. I tried setting a defined value for the input as well and still receive an error "command not found" when checking input vs randNum variable
n=$RANDOM$RANDOM$RANDOM; let "n %= 10000000000";
echo $n
for i in {5..1}; do echo $i; sleep 1; tput cuu1; tput el; done
tput cuu1; tput el
echo "what was that number?"
#read input
input=999999999
if [$input == $n]
then
echo "you are correct"
else
echo "you are incorrect"
fi
Shells need spaces around brackets [ and ] when used for this purpose (replacement syntax for the test command), and you should better use -eq instead of == for numeric comparison:
if [ $input -eq $n ]
If you use the arithmetic comparison, rather than the old testcommand (a.k.a. [) then you can avoid these issues. Spaces here are less important inside the brackets:
if (( input == n ))
Note that the leading $ is not required (and using it can cause issues)

Resources