First time i see constantly used the ( for if statements, i'm used to [..
To explain that i have to dig into UNIX history somewhat:
First: The general form of the if-statement in Bourne-descendant shells (ksh, bash, [POSIX-]sh, etc.) is:
Code:
if command ; then
Which branch of the if-statement (the "if"- or the "else"-branch) is executed is decided by examining the return code (error level) of the command. The following lines will do absolutely the same, but the latter is preferable because it saves on fork()-calls:
Code:
/some/command
if [ $? -eq 0 ] ; then
Code:
if /some/command ; then
What is now if [ .... ], you might ask.
Because of the mechanism of if the UNIX designers came up with a clever utility: test. This command executes all sorts of comparisons and sets its return code according to the result of these comparison. If you wanted to branch on two variables being equal you could do (i have marked bold the test-command and its parameters):
Code:
if /usr/bin/test $a -eq $b ; then
Now, this looked a bit unhandy. Therefore a further trick was to create a link /usr/bin/[ to /usr/bin/test, the line would now look like:
Code:
if [ $a -eq $b ; then
But this still was not completely satisfactory, because programmers are religiously raised to close what they open: quotes, brackets, braces, clauses, ....
Therefore, the last twist was to create /usr/bin/[ as a program in its own right which works just like /usr/bin/test but requires a "]" as the last parameter. Now the code as we know it were possible:
Code:
if [ $a -eq $b ] ; then
Notice, though, that "[" is a command and "]" is one of its parameters. Therefore, the following are all syntactically wrong (for obvious reasons):
Code:
if [$a -eq $b ] ; then
if[ $a -eq $b ] ; then
if [ $a -eq $b] ; then
OK, this is all good, but what is if [[ ... then?
In fact "[[" is the same as "[", but as a shell-built-in instead of an external command. Shell developers found out that test and its companion [ were used so oftenly that they built it into their shells to save on system calls.
Lastly, what is if (( ... )) now?
Well, the same as i wrote above: if command, where command is a device in ksh as well as bash: you can do integer math surrounded by double rounded brackets:
Code:
(( x += 1 ))
is a legal command and the same as (in fact a substitution for) the (quite old-fashioned) built-in let:
Code:
let x=x+1
Like let also (( ... )) has a return code and this is what if acts upon.
Right, personal experience showed me that the use of [[ condition ]] is the most compatible one among shells.
But then again i only use sh and bash on diffrent linux'...
man bash says:
Code:
((expression))
The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is non-zero, the return status is 0; otherwise the
return status is 1. This is exactly equivalent to let "expression".
[[ expression ]]
Return a status of 0 or 1 depending on the evaluation of the conditional expression expression. Expressions are composed of the primaries described below under CONDITIONAL EXPRES-
SIONS. Word splitting and pathname expansion are not performed on the words between the [[ and ]]; tilde expansion, parameter and variable expansion, arithmetic expansion, command
substitution, process substitution, and quote removal are performed. Conditional operators such as -f must be unquoted to be recognized as primaries.
When used with [[, the < and > operators sort lexicographically using the current locale.
When the == and != operators are used, the string to the right of the operator is considered a pattern and matched according to the rules described below under Pattern Matching.
If the shell option nocasematch is enabled, the match is performed without regard to the case of alphabetic characters. The return value is 0 if the string matches (==) or does
not match (!=) the pattern, and 1 otherwise. Any part of the pattern may be quoted to force it to be matched as a string.
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular
expression and matched accordingly (as in regex(3)). The return value is 0 if the string matches the pattern, and 1 otherwise. If the regular expression is syntactically incor-
rect, the conditional expression's return value is 2. If the shell option nocasematch is enabled, the match is performed without regard to the case of alphabetic characters. Any
part of the pattern may be quoted to force it to be matched as a string. Substrings matched by parenthesized subexpressions within the regular expression are saved in the array
variable BASH_REMATCH. The element of BASH_REMATCH with index 0 is the portion of the string matching the entire regular expression. The element of BASH_REMATCH with index n is
the portion of the string matching the nth parenthesized subexpression.
Expressions may be combined using the following operators, listed in decreasing order of precedence:
( expression )
Returns the value of expression. This may be used to override the normal precedence of operators.
! expression
True if expression is false.
expression1 && expression2
True if both expression1 and expression2 are true.
expression1 || expression2
True if either expression1 or expression2 is true.
The && and || operators do not evaluate expression2 if the value of expression1 is sufficient to determine the return value of the entire conditional expression.
((expression))
The expression is evaluated according to the rules described below
under ARITHMETIC EVALUATION. If the value of the expression is
non-zero, the return status is 0; otherwise the return status is 1.
This is exactly equivalent to let "expression".
[[ expression ]]
Return a status of 0 or 1 depending on the evaluation of the
conditional expression expression.
This is exactly what i said. I have marked bold the relevant part pertinent to "(( ... ))" and for "[[ ... ]]" have a look at what man test has to say about tests behavior.
Hi,
How can we get the process id of the terminal we are using?
When we logged in to unix, we have an associated terminal. we can use "tty" command to get the terminal we are using like:
/dev/pts/0
I want to know the process id of this terminal. Please reply as I searched a lot but I... (8 Replies)
Hello everyone, I have an interesting project I'd like to implement on a Linux server here at work. Essentially, I'd like to replace a handful of Windows servers with a single Linux server. The only task these Windows servers perform, is provide remote desktops via RDP protocol that people... (13 Replies)
Hello!
I need to create a file and provide access to two users of the file under the same command in linuxs terminal window.
The question is how can I do it? (3 Replies)
hi im new to this and i just want to learn about linux and i just wanted to know how would i be able to perform a system check to see if a directory exists.
can any one help me? (2 Replies)
Hello all
is there any free tool like linux tabbed terminal but for windows
im used to work with putty and its great but i wander if there something like putty
but with tabs
thanks (12 Replies)
Hi,
I keep on getting the following error on my linux terminal. It did not harm my system so far, but I was wondering if this can be eliminated.
{
Gecko:4617): GLib-GObject-CRITICAL **: file gobject.c: line 1337 (g_object_unref): assertion `G_IS_OBJECT (object)' failed
(Gecko:4617):... (2 Replies)
Hi all,
I would like to know how to have a color display in the terminal...
In the sense that,
In many linux terminals,we have color coded for each file type,
green for executable ,blue for dirs and so on...
I wanted to know how i can have the same arrangement in solaris(b-79a)
I am not... (5 Replies)
When I log in from my linux workstation (CentOS4) to a solaris 8 server using SSH or telnet, the terminal settings don't seem to work well. When I tail or vi a file, I get a blank screen or no response, and I am no longer able to interact with the session. I have to type the escape sequence to... (2 Replies)