Define variables of choice
Now we know how to write a simple hello world shell script. Next, we will be getting familiar with variables in shell and how to define and use variables in shell.
Nomenclature
A variable name can be a combination of alphanumeric and underscore. Also, the name of the variable can't start with a number. The variable names in shell script are case-sensitive. Special characters, such as *, -, +, ~, ., ^, and so on, are not used in variable names because they have a special meaning in shell. The following table illustrates the correct and incorrect ways of naming a variable:
Correct variable names |
Incorrect variable names |
---|---|
variable |
2_variable |
variable1 |
2variable |
variable_2 |
variable$ |
_variable3 |
variable*^ |
Assigning a value
We can assign a value to a variable by using an assignment (=
) operator and followed by a value. While assigning a variable value, there shouldn't be any space before and after the assignment operator. Also, a variable can't be declared alone; it has to be followed by its initial value assignment:
$ book="Linux Shell Scripting" # Stores string value $ book = "Linux Shell Scripting" # Wrong, spaces around = operator $ total_chapters=8 # Stores integer value $ number_of_pages=210 # Stores integer value $ average_pages_per_chapter=26.25 # Stores float value
So, it's quite easy to declare and assign a value to a variable in shell script. You don't have to worry about the data type of a variable on the left-hand side. Whatever value you provide on the right-hand side, the variable stores that value.
Tip
Downloading the example code
You can download the example code files from your account at http://www.packtpub.com for all the Packt Publishing books you have purchased. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you.
Accessing a value
To access a variable value, use a dollar sign ($
) operator followed by a variable name:
#!/bin/bash #Filename: variables.sh #Description: Basic variable definition and accessing them book="Linux Shell Scripting" total_chapters=8 number_of_pages=210 average_pages_per_chapter=26.25 echo "Book name - $book" echo "Number of Chapters - $total_chapters" printf "Total number of pages in book - $number_of_pages\n" printf "Average pages in each chapter - %-.2f\n" $average_pages_per_chapter
The result of this script will look as follows:
Book name - Linux Shell Scripting Number of Chapters - 8 Total number of pages in book - 210 Average pages in each chapter – 26.25
We can remove the value of a variable using the unset
keyword in bash
. Using unset
to a variable deletes and resets it to null:
#!/bin/bash #Filename: unset.sh #Description: removing value of a variable fruit="Apple" quantity=6 echo "Fruit = $fruit , Quantity = $quantity" unset fruit echo "Fruit = $fruit , Quantity = $quantity"
The result after running this script will look as follows:
Fruit = Apple , Quantity = 6 Fruit = , Quantity = 6
It's clear that we used unset on a fruit variable, so when we try to access a variable fruit after unsetting it in line no. 8, it prints nothing. The quantity
variable still retains its value because we haven't used unset on it.
Constant variables
We can also create the constant
variable in bash
whose value can't be changed. The readonly
keyword is used to declare a constant variable. We can also use declare -r
followed by a variable name to make it constant:
#!/bin/bash #Filename: constant.sh #Description: constant variables in shell readonly text="Welcome to Linux Shell Scripting" echo $text declare -r number=27 echo $number text="Welcome"
The result after running this script will look as follows:
Welcome to Linux Shell Scripting 27 constant.sh: line 9: text: readonly variable
From the error message, it's clear that we can't change the value of a constant variable, and also we can't unset the value of the constant variable.
Reading variables from a user input
We can ask the user to provide input using the read
shell built in command. The number of inputs to be given by a user is equivalent to the number of arguments provided to read
. The value inserted by a user is stored in respective parameters passed to read
. All parameters act as variables in which the corresponding user input value is stored.
The syntax of read
is as follows:
read [options] var1 var2 … varN
If no variable in an argument is specified, the input value by a user will be stored in the inbuilt variable REPLY
and can be accessed further using $REPLY
.
We can read a user input in its input variable as follows:
$ read Hello World $ echo $REPLY Hello World
We can read a value from user input as follows:
$ read text Hello $ echo $text Hello
We can read multiple values from user input as follows:
$ read name usn marks Foo 345 78 $ echo $name $usn $marks Foo 345 78
We can read only the n
characters and don't wait for the user to input a complete line as follows:
$ read -n 5 # option -n number takes only 5 characters from user input Hello$ $ echo $REPLY Hello
We can prompt the user a message before reading user input as follows:
$ read -p "What is your name?" # -p allows to prompt user a message What is your name?Foo $ echo $REPLY Foo
Hiding an input character when reading in console:
$ read -s -p "Enter your secret key:" # -s doesn't echo input in console Enter your secret key:$ #Pressing enter key brings command prompt $ echo $REPLY foo
The following example shows the read
command's usage:
#!/bin/bash #Filename: read.sh #Description: Find a file in a path entered by user read -p "Enter filename to be searched:" filename=$REPLY read -p "Enter path for search:" path echo "File $filename search matches to" find $path -name $filename
The following is the result of running the read.sh
script in bash
:
Enter filename to be searched:read Enter path for search:/usr/bin File read search matches to /usr/bin/read
Here, the find
command has been used to search for the filename in the specified path. The detailed discussion of the command find
will be done in Chapter 6, Working with Files.