preface
This article is a summary of my own learning and use. My writing style is not very good. If you have any questions, please feel free to communicate with me
Github: https://github.com/hi-dhl/fast_guides
What is the Shell
A Shell is an application that provides an interface through which users can access the services of the operating system kernel. A Shell script is a type of script written for a Shell. When we say shell, we usually mean shell scripts.
Environment and Tools
The Shell, like Java, PHP, and Python programming, requires only a text editor that writes the code and a script interpreter that interprets the execution.
Mac OS, Linux with shell interpreter, Windows more trouble, because Win7 professional edition and flagship edition of the default installation of PowerShell, standard edition and home edition is not installed, for convenience, it is recommended to install Cygwin
PHP and Python can also be used as Shell programming
PHP and Python are high-level programming languages, but you can also do Shell programming because you can also do scripting as long as you have an interpreter
Here is an example of a Python Shell Script (assuming the file name is op_python_base.py) :
#! /usr/bin/env PYTHon3 // Tells Python to look for Python in the system environment
# -* -coding: utF-8 -*- // set to UTF-8 encoding
for index in range(10):
print(index);
Copy the code
Source: op_python_base
Here is an example of a PHP Shell Script (assuming the file name is op_php_base.php) :
#! /usr/bin/php<? phpfor($i=0 ;$iThe < 10;$i{+ +)echo $i;
}
?>
Copy the code
Source: op_php_base
Why learn Shell
There are several reasons why you would want to learn a strange, obscure Shell when you can write scripts in PHP and Python
-
Environment compatibility, Win7 professional edition and flagship edition install PowerShell by default, standard edition and home edition is not installed, other mainstream operating systems are premade Shell interpreter, so use sh, bash, provided for others to use is very convenient, But PHP, Python, and so on need to be installed
-
If you want to do scheduled tasks such as checking whether processes exist, automatically backing up, or automatically deploying environments, synchronizing data between servers, etc. Sh and bash are your best choices
Sh and bash
Sh: Bourne Shell, a standard shell interpreter of Portable Operating System Interface (POSIX). Its binary file path is usually /bin/sh
Bash: Bash is a Bourne shell replacement, belonging to GNU Project, and the binary path is usually /bin/bash
The first shell script
Let’s start with an example
I’m sure any of you who have written code will be familiar with the following code (assuming the file name is op_base.sh) :
#! /usr/bin/env bash
mkdir code
cd code
for ((i=0; i<3; i++)); do
touch test_${i}.txt
echo "The shell is simple." >> test_${i}.txt
done
Copy the code
Line 1: Find the interpreter of the specified script from the system path Line 2: Create folder named code Line 3: enter the folder created Line 4: for loop 3 times Line 4: create file Line 5: write information to the created file Line 6: end the loop
Mkdir, touch, CD, touch, echo are system commands. In the command line, you can directly execute for, do, done is the syntax of shell scripting language for loop
Source: op_base. Sh
Write a Shell
Create a new file with the extension sh (sh for shell). The extension does not affect the execution of the script. If you use PHP, the extension is PHP, and if you use Python, the extension is Python
The first line usually looks something like this:
#! /usr/bin/php
#! /usr/bin/env python3
#! /usr/bin/env bashCopy the code
#!” Is a convention flag that tells the system what interpreter the script needs to execute /env is looking in the system’s PATH directory
There are two ways to run Shell scripts:
As executable program
chmod +x op_base.sh
./op_base.sh
Copy the code
In the first line, set the op_base.sh executable permission. In the second line, run op_base.sh
As a parameter
/bin/sh op_base.sh
Copy the code
variable
When you define a variable, you do not need to add a sign before the variable name, as in Python, but in PHP you need to add $to the variable name. For example:
my_name="jack"
my_name='jack';
Copy the code
Ps: there must be no space between the variable name and the equal sign, and no space after the variable;
Quotes in the Shell are similar to those in PHP; strings can be in single or double quotes
Restrictions on single quoted strings:
- Any character in a single quote is printed as is, and variables in a single quote string are invalid
- Single quotes cannot occur in a single quote string (not even if you escape single quotes)
Double quotation marks:
- You can have variables in double quotes
- Escape characters can appear in double quotes
There is no difference between single and double quotes in Python, but Python also has three quotes, within which characters are not escaped
Use the variable
For variables that have already been defined, use the appropriate $in front
echo $my_name
echo ${my_name}
Copy the code
The curly braces around the variable name are optional. The second form is recommended
annotation
Lines beginning with “#” are comments and are ignored by the interpreter.
Multiline comment
There are no multiline comments in sh, only a # sign per line. Like this:
# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
# Author: jack
#
# Notes: 10 minutes to get started with Shell scripting
#
# Project home page:
# https://github.com/hi-dhl/fast_guides
# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
Copy the code
string
Strings can be in single, double, or no quotes. The difference between single and double quotes is similar to PHP
Unlike other languages such as PHP and Python, the Shell has many data types. The common data types used in the Shell are strings, numbers, and strings.
Restrictions on single quoted strings:
- Any character in a single quote is printed as is, and variables in a single quote string are invalid
- Single quotes cannot occur in a single quote string (not even if you escape single quotes)
Double quotation marks:
- You can have variables in double quotes
- Escape characters can appear in double quotes
String operation
Concatenated string
my_name="jack";
my_age="20"
echo $my_name $my_age
echo $my_name$my_age
Copy the code
Get string length
echo ${#my_name}
Copy the code
Intercept string
echo ${my_name:0:2}
Copy the code
Source: op_str. Sh
Shell array
Define an array
In the Shell, arrays are represented by parentheses, and array elements are separated by “Spaces”. The general form of defining an array is:
name=(name1 name2 name3)
Copy the code
You can also define the components of an array separately:
ary[0]=name1
ary[1]=name2
ary[3]=name3
Copy the code
Ps: No continuous subscripts can be used, and there is no limit to the range of subscripts
Reads an array of
The general format for reading array element values is:
${array name [subscript]}
Copy the code
Such as:
echo ${name[0]}
Copy the code
Use the @ sign to get all the elements in an array, for example:
echo ${name[@]}
Copy the code
Gets the length of the array
We get the length of an array the same way we get the length of a string, for example:
Get the number of elements in the array
length=${#name[@]}
echo $length
# or
length=${#name[*]}
echo $length
Get the length of a single element in an array
lengthn=${#name[n]}
echo $length
Copy the code
Source: op_arry. Sh
Shell flow control
Unlike Other languages such as Java, PHP, and Python, the flow control of SH cannot be null, for example:
<? phpif (isset($_GET["q"])) {
search(q);
}
else{// do nothing}Copy the code
Do not write this in sh/bash. Do not write else if there is no statement to execute on the else branch
if
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
Copy the code
Example:
#! /usr/bin/env bash
a=1
b=2
if [ $a= =$b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "A greater than b"
elif [ $a -lt $b ]
then
echo "A less than b"
else
echo "There are no qualifications."
fi
Copy the code
Source: op_if. Sh
The for loop
The Shell’s for loop is a bit like Python’s
Python’s for loop
for index in1, 2, 3, 4, 5:print(index);
Copy the code
Shell for loop, first way
for index in 1 2 3 4 5; do
echo "index="$index
done
Copy the code
Shell’s for loop, the second way
for ((i=0; i<5; i++)); do
echo "i="$i
done
Copy the code
Source: op_for. Sh
While statement
The while loop is used to continuously execute a sequence of commands and also to read data from an input file; Commands are usually test conditions.
int=1
while(( $int< = 5))do
echo $int
let "int++"
done
Copy the code
Source: op_while. Sh
Shell combines system commands
In the field of character processing, there are grep, AWk, and SED. Grep is responsible for finding specific lines, AWK can split lines into multiple fields, and SED can realize write operations such as update, insert, and delete.
For example, periodically check whether nginx and mysql are shut down
path=/var/log
log=${path}/httpd-mysql.log
name=(apache mysql)
exs_init[0]="service httpd start"
exs_init[1]="/etc/init.d/mysqld restart"
for ((i=0; i<2; i++)); do
echo "Check${name[i]}Does the process exist?"
ps -ef|grep ${name[i]} |grep -v grep
if[$?-eq0];then
pid=$(pgrep -f ${name[i]})
echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} is running with pid $pid" >> ${log}
else
$(${exs_init[i]})
echo "`date +"%Y-%m-%d %H:%M:%S"` ${name[$i]} start success" >> ${log}
fi
done
Copy the code
Check whether the nginx and mysql processes exist. If they do not exist, restart them automatically. The script will write a log every time it is run, so you can check the log file. If the process does not exist frequently, I am afraid to investigate the deep reason.
Source: check_nginx. Sh
Edit the /etc/crontab file
crontab -e
Copy the code
Add a line at the end of the file:
*/5 * * * * /xxx/check_nginx.sh > /dev/null 2>&1
Copy the code
Run the/XXX /check_nginx.sh script every five minutes, where XXX indicates the path
/dev/null 2>&1 means that the shell command will not output any information to the console and will not output any information to the file.
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
Copy the code
The added configuration takes effect only after a restart
service crond restart
Copy the code