Shell equality operators (=, ==, -eq)
=
and ==
are for string comparisons-eq
is for numeric comparisons-eq
is in the same family as -lt
, -le
, -gt
, -ge
, and -ne
==
is specific to bash (not present in sh (Bourne shell), ...). Using POSIX =
is preferred for compatibility. In bash the two are equivalent, and in sh =
is the only one that will work.
$ a=foo
$ [ "$a" = foo ]; echo "$?" # POSIX sh
0
$ [ "$a" == foo ]; echo "$?" # bash-specific
0
$ [ "$a" -eq foo ]; echo "$?" # wrong
-bash: [: foo: integer expression expected
2
(Note: make sure to quote the variable expansions. Do not leave out the double-quotes above.)
If you're writing a #!/bin/bash
script then I recommend using [[
instead. The double square-brackets [[...]]
form has more features, a more natural syntax, and fewer gotchas that will trip you up. For example, double quotes are no longer required around $a
:
$ [[ $a == foo ]]; echo "$?" # bash-specific
0
See also:
- What's the difference between [ and [[ in Bash?
What is the difference between -lt and in shell?
Shell scripting has been always different when it comes to syntax.
so when you say -lt
it means less than (<).so when you write your code it works totally fine
while [ $num -lt 10 ]; do
echo "$num"
((num++))
done
But when you use <
this in the shell script it is used to read input from file or directory. So here in your case, it will search for the name of the file which is inside the $num
variable
In simple words
-lt
is Less than which is used for condition checking<
is used for Reading input from the files.
Meaning of $? (dollar question mark) in shell scripts
This is the exit status of the last executed command.
For example the command true
always returns a status of 0
and false
always returns a status of 1
:
true
echo $? # echoes 0
false
echo $? # echoes 1
From the manual: (acessible by calling man bash
in your shell)
?
Expands to the exit status of the most recently executed foreground pipeline.
By convention an exit status of 0
means success, and non-zero return status means failure. Learn more about exit statuses on wikipedia.
There are other special variables like this, as you can see on this online manual: https://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
Trying to understand a Bash script given to me, specifically the while loop
-le
means less or equal to. See the following example which would print 0-9:
i=0
while [ $i -le 9 ]; do
echo $i
let i++
done
Shell script for loop syntax
Brace expansion, {x..y} is performed before other expansions, so you cannot use that for variable length sequences.
Instead, use the seq 2 $max
method as user mob stated.
So, for your example it would be:
max=10
for i in `seq 2 $max`
do
echo "$i"
done
Bash -eq and ==, what's the diff?
-eq
is an arithmetic test.
You are comparing strings.
From help test
:
Other operators:
arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne,
-lt, -le, -gt, or -ge.
When you use [[
and use -eq
as the operator, the shell attempts to evaluate the LHS and RHS. The following example would explain it:
$ foo=something
+ foo=something
$ bar=other
+ bar=other
$ [[ $foo -eq $bar ]] && echo y
+ [[ something -eq other ]]
+ echo y
y
$ something=42
+ something=42
$ [[ $foo -eq $bar ]] && echo y
+ [[ something -eq other ]]
$ other=42
+ other=42
$ [[ $foo -eq $bar ]] && echo y
+ [[ something -eq other ]]
+ echo y
y
Bash script while loop won't work: -le unary operator expected
set
is used to set the positional parameters, not ordinary variables.
$ unset i
$ set i=1991
$ echo "$1"
i=1991
$ echo "$i"
$
The i=1991
is a single argument to set
, treated as a literal string, not an assignment of any kind.
Just drop the set
:
i=1991
while (( i < 2017 ));
...
((i++))
done
How to check if a number is within a range in shell
If you are using Bash, you are better off using the arithmetic expression, ((...))
for readability and flexibility:
if ((number >= 2 && number <= 5)); then
# your code
fi
To read in a loop until a valid number is entered:
#!/bin/bash
while :; do
read -p "Enter a number between 2 and 5: " number
[[ $number =~ ^[0-9]+$ ]] || { echo "Enter a valid number"; continue; }
if ((number >= 2 && number <= 5)); then
echo "valid number"
break
else
echo "number out of range, try again"
fi
done
((number >= 2 && number <= 5))
can also be written as ((2 <= number <= 5))
.
See also:
- Test whether string is a valid integer
- How to use double or single brackets, parentheses, curly braces
Related Topics
Where Does Pp (Par) Unpack Add (-A) Files
Merge Files with Bash by Primary Key
Copy Differences Between Two Files in Unix
Omitting the First Line from Any Linux Command Output
Redirecting Tcp-Traffic to a Unix Domain Socket Under Linux
How Can Objdump Emit Intel Syntax
What Is the Use of Various Qt Platform Plugins
Ssh Error When Executing a Remote Command: "Stdin: Is Not a Tty"
Makefile with Multiple Targets
Gdb: Redirect Target Stdout Temporarly
Backing Up (And Restoring) a Plone Instance
Unzip All Files in a Directory
Cut or Awk Command to Print First Field of First Row
Shell Script Current Directory