Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I'm new to bash programming. I've read two good, long guides, but they made a mess in my head about operators and keywords.

Which are more commonly and widely used? I don't know when to use which and why.

  1. test, [[ ]] or [ ] or even (( ))
  2. $((exp)) or $[exp]
  3. -gt or >, ge or >= etc.
  4. when to use < and > or ( ) and when we have to escape it with \: \< \( etc.
  5. == or = (string comparisons)

I know the basic differences between [ and [[ but other questions are a mystery for me.

Thank you in advance

share|improve this question
2  
A very useful wiki that is up to date and mentions much good practice is Greg's wiki. The Bash guide and the FAQ on there are particularly useful. –  user76204 Mar 27 '13 at 18:32
add comment

1 Answer 1

  • test is a shell built-in which (obviously) tests for some given condition. Some older shells need a special command. So you'll find also a program at /usr/bin/test.
  • [ is also a program to test for some condition. This software needs also a closing bracket and you can find it at /usr/bin/[.
  • [[…]] is an alternative to test and [. It was developed for the Korn shell (ksh). But you also find it in Bash versions greater than 2 and in the Z Shell. The double brackets have some nifty features:
    • The shell does no word splitting or file name expansion.
    • You need no quoting.
    • Instead of -a (AND) or -o (OR) you can use && or ||.
    • The = can do a lot more.
  • ((…)) is equivalent to let. So basically ((expression)) is the same as let "expression". However with let you can use more than one expression, but double braces only allow one expression.
  • $((…)) (and also $[…]) does some calculation. You shell tries to calculate the expression inside the braces and replaces the expression with the result. So echo $((1+1)) leads to echo 2. So your shells prints the number 2.

Every time when you want to compare two numbers you should use the option with a dash and two letters (-ge, -lt etc.). If you want to compare strings you should use = or !=.

Your question regarding escaping is quite hard to answer. Because it depends on the software you use besides from the shell. So i.e. grep and grep -E need different escaping. This is also the case with sed, awk and others. So the best option is to have a look at the manpage. After some time you get accustomed and know when to use escaping.

share|improve this answer
    
thank you. one more question - because its possible to do comparison using ((...)) - is it more common to use this version: if (( 2 > 1 )) OR this: if [[ 2 -gt 1 ]] –  MikeD Mar 29 '13 at 23:34
    
I would assume that if [ 2 -gt 1 ]; … is more common, because I see this more often in shell scripts and as far as I know this is POSIX compliant. –  qbi Mar 30 '13 at 7:14
    
Another thing to keep in mind is that [ expression ] is true if expression evaluates to/returns zero, but (( expression )) is true if expression evaluates to/returns non-zero. –  Joe Apr 4 '13 at 6:04
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.