What is shell programming?
In Linux, although there are various graphical interface tools, shell is still a very flexible tool. Shell is not only a collection of commands, but also a very good programming language. You can use shell to automate a large number of tasks. shell is especially good at system management tasks, especially for tasks that are easier to use, maintainability, and portability than efficiency.
Next, let's take a look at how shell works:
Create a script
Linux has many different shells, but we usually use bash (bourne again shell) for shell programming, because bash is free and easy to use. So in this article, all the scripts provided by the author use bash (but in most cases, these scripts can also be run in bash's big sister, bourne shell ).
Like other languages, you can use any text editor, such as nedit, kedit, emacs, and vi.
To compile our shell program.
The program must start with the following line (must begin with the first line of the file ):
#! /Bin/sh
Symbol #! The parameter used to tell the system that the program is used to execute the file. In this example, we use/bin/sh to execute the program.
When editing a script, you must make it executable if you want to execute it.
To make the script executable:
Chmod + x filename
Then, you can run your script by entering:./filename.
Note
During shell programming, a sentence starting with # represents a comment until the end of this line. We sincerely recommend that you use annotations in your program. If you have used annotations, you can understand the role and working principle of the script in a short time even if the script is not used for a long time.
Variable
You must use variables in other programming languages. In shell programming, all variables are composed of strings, and you do not need to declare variables. To assign a value to a variable, you can write as follows:
Variable name = Value
You can add a dollar sign ($) before the variable to retrieve the variable value:
#! /Bin/sh
# Assign values to variables:
A = "Hello World"
# Print the content of variable:
Echo "A is :"
Echo $
Enter the preceding content in your editor and save it as a file first. Then run chmod + X first
Make it executable, and enter./first to execute the script.
This script will output:
A is:
Hello World
Sometimes the variable name is easily confused with other words, such:
Num = 2
Echo "this is the $ numnd"
This does not print "this is the 2nd", but only prints "this is the", because shell will search for the value of the variable numnd, but there is no value for this variable. We can use curly braces to tell shell that we want to print the num variable:
Num = 2
Echo "this is the $ {num} Nd"
This will print: This is the 2nd
Many variables are automatically set by the system, which will be discussed later when these variables are used.
If you need to process mathematical expressions, you need to use programs such as expr (see below ).
In addition to the shell variables that are generally valid in the program, there are also environment variables. Variables processed by the export keyword are called environment variables. We will not discuss environment variables, because generally, only environment variables are used in the login script.
Shell commands and Process Control
Three types of commands can be used in shell scripts:
1) Unix command:
Although any unix command can be used in shell scripts, some more common commands are used. These commands are usually used for file and text operations.
Common command syntax and functions
Echo "some text": print the text on the screen
Ls: file list
Wc-l filewc-w filewc-c file: calculate the number of file lines. Calculate the number of words in the file. Calculate the number of characters in the file.
Cp sourcefile destfile: file copy
Mv oldname newname: rename a file or move a file
Rm file: delete an object
Grep 'pattern' file: searches for strings in a file, for example, grep 'searchstring' file.txt.
Cut-B colnum file: specify the content range of the file to be displayed, and output them to the standard output device, for example: output 5th to 9th characters in each line cut-b5-9 file.txt do not confuse with cat command, this is two completely different commands
Cat file.txt: output file content to the standard output device (screen)
File somefile: get the file type
Read var: prompt the user to input and assign the input value to the variable.
Sort file.txt: sorts the rows in the file.txt file.
Uniq: Delete the columns in a text file, for example, sort file.txt | uniq
Expr: perform mathematical operations example: Add 2 and 3 expr 2 "+" 3
Find: search for a file. For example, search for find.-Name filename-print based on the file name.
Tee: outputs data to the standard output device (screen) and files such as: somecommand | tee OUTFILE
Basename file: returns a file name that does not contain a path, for example, basename/bin/tux.
Dirname file: the path of the returned file. For example, dirname/bin/tux will return/bin.
Head file: prints the first few lines of a text file.
Tail file: number of rows at the end of a text file
Sed: SED is a basic search replacement program. You can read text from standard input (such as command pipeline) and output the results to standard output (screen ). This command uses a regular expression (see references) for search. Do not confuse with wildcards in shell. For example, replace linuxfocus with linuxfocus: CAT text. File | SED's/linuxfocus/'> newtext. File
Awk: awk is used to extract fields from text files. By default, the field delimiter is a space. You can use-F to specify other separators. Cat file.txt | awk-F, '{print $1 "," $3}', which is used here as a field delimiter and prints both the First and Third fields. If the file contains the following content: Adam Bor, 34, indiakerry Miller, 22, and USA, the output result is Adam Bor, indiakerry Miller, USA.
2) concept: pipelines, redirection, and backtick
These are not system commands, but they are really important.
The pipeline (|) uses the output of a command as the input of another command.
Grep "hello" file.txt | wc-l
Search for a row containing "hello" in file.txt and calculate the number of rows.
Here, the grep command output serves as the wc command input. Of course, you can use multiple commands.
Redirection: output the command result to a file instead of a standard output (screen ).
> Write the file and overwrite the old file
> Add it to the end of the file to retain the content of the old file.
Backlash
You can use a backslash to output a command as a command line parameter of another command.
Command:
Find.-mtime-1-type f-print
Used to search for files modified in the past 24 hours (-mtime-2 indicates the past 48 hours. If you want to pack all the searched files, you can use the following script:
#! /Bin/sh
# The ticks are backticks (') not normal quotes ('):
Tar-zcvf lastmod.tar.gz 'Find.-mtime-1-type f-print'
3) Process Control
If the expression "if" is true, the part after then is executed:
If...; then
....
Elif...; then
....
Else
....
Fi
In most cases, you can use test commands to test the conditions. For example, you can compare strings, determine whether a file exists, and whether the file is readable...
"[]" Is usually used to represent a conditional test. Note that spaces are important. Make sure that the square brackets have spaces.
[-F "somefile"]: determines whether it is a file.
[-X "/bin/ls"]: determines whether/bin/ls exists and has the executable permission.
[-N "$ var"]: determines whether the $ var variable has a value.
["$ A" = "$ B"]: determines whether $ a and $ B are equal.
Run man test to view all types of test expressions that can be compared and judged.
Directly execute the following script:
#! /Bin/sh
If ["$ SHELL" = "/bin/bash"]; then
Echo "your login shell is the bash (bourne again shell )"
Else
Echo "your login shell is not bash but $ SHELL"
Fi
The variable $ SHELL contains the name of the logon shell. We compared it with/bin/bash.