Showing posts with label Linux. Show all posts
Showing posts with label Linux. Show all posts

Jan 23, 2015

Unix Shell scripting conditional expressions


In this post, lets discuss the use of conditionals in bash scripts.

What are conditionals?


At times you need to specify different courses of action to be taken in a shell script, depending on the success or failure of a command. The if construction allows you to specify such conditions.

The most compact syntax of the if command is:

if TEST-COMMANDS; then CONSEQUENT-COMMANDS; fi

The TEST-COMMAND list is executed, and if its return status is zero, the CONSEQUENT-COMMANDS list is executed. The return status is the exit status of the last command executed, or zero if no condition tested true.

The TEST-COMMAND often involves numerical or string comparison tests, but it can also be any command that returns a status of zero when it succeeds and some other status when it fails.

Syntax:


if [ expression 1 ];
then
  Statement(s) to be executed if expression 1 is true
elif [ expression 2 ];
then
   Statement(s) to be executed if expression 2 is true
elif [ expression 3 ];
then
   Statement(s) to be executed if expression 3 is true
else
   Statement(s) to be executed if no expression is true
fi

Example:



#!/bin/sh
a=1
b=2

if [ $a == $b ];
then
   echo "a is equal to b"
elif [ $a -gt $b ];
then
   echo "a is greater than b"
elif [ $a -lt $b ];
then
   echo "a is less than b"
else
   echo "None of the conditions matched"
fi

Now let us see the different ways to use expressions with numeric and strings.

       ( EXPRESSION )
              EXPRESSION is true

       ! EXPRESSION
              EXPRESSION is false

       EXPRESSION1 -a EXPRESSION2
              both EXPRESSION1 and EXPRESSION2 are true

       EXPRESSION1 -o EXPRESSION2
              either EXPRESSION1 or EXPRESSION2 is true

       -n STRING
              the length of STRING is nonzero

       STRING equivalent to -n STRING

       -z STRING
              the length of STRING is zero

       STRING1 = STRING2
              the strings are equal

       STRING1 != STRING2
              the strings are not equal

       INTEGER1 -eq INTEGER2
              INTEGER1 is equal to INTEGER2

       INTEGER1 -ge INTEGER2
              INTEGER1 is greater than or equal to INTEGER2

       INTEGER1 -gt INTEGER2
              INTEGER1 is greater than INTEGER2

       INTEGER1 -le INTEGER2
              INTEGER1 is less than or equal to INTEGER2

       INTEGER1 -lt INTEGER2
              INTEGER1 is less than INTEGER2

       INTEGER1 -ne INTEGER2
              INTEGER1 is not equal to INTEGER2


Expressions for file operations can be found in this link: File Operations


All these details could be obtained from 'man test' command on linux/unix terminal.

Jan 12, 2015

Shell Scripting: File Operations



In Shell scripting, we can perform lots of file based operations such as checking if file exists, checking if it's a directory, checking if it's a writable file and so on. 

For Example, following is a shell script that checks if the file "config_file.txt" exists.
 
#!/bin/bash
FILE="config_file.txt" if [ -f $FILE ]; then echo "File $FILE exists" else echo "File $FILE does not exists" fi

Following are the list of options available for file operations.

-a file
True if file exists.

-b file
True if file exists and is a block special file.

-c file
True if file exists and is a character special file.

-d file
True if file exists and is a directory.

-e file
True if file exists.

-f file
True if file exists and is a regular file.

-g file
True if file exists and is set-group-id.

-h file
True if file exists and is a symbolic link.

-k file
True if file exists and its ‘‘sticky’’ bit is set.

-p file
True if file exists and is a named pipe (FIFO).

-r file
True if file exists and is readable.

-s file
True if file exists and has a size greater than zero.

-t fd 
True if file descriptor fd is open and refers to a terminal.

-u file
True if file exists and its set-user-id bit is set.

-w file
True if file exists and is writable.

-x file
True if file exists and is executable.

-O file
True if file exists and is owned by the effective user id.

-G file
True if file exists and is owned by the effective group id.

-L file
True if file exists and is a symbolic link.

-S file
True if file exists and is a socket.

-N file
True if file exists and has been modified since it was last read.

file1 -nt file2
True if file1 is newer (according to modification date) than file2, or if file1 exists and
file2 does not.

file1 -ot file2
True if file1 is older than file2, or if file2 exists and file1 does not.

file1 -ef file2
True if file1 and file2 refer to the same device and inode numbers.