一、Hello Shell
touch HelloShell.sh
vim HelloShell.sh
------------------------------
echo "Hello Shell"
------------------------------
cat HelloShell.sh
ll HelloShell.sh
chmod o+x Helloword.sh
ll HelloShell.sh
[ root@qs shell]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
二、Shell 变量
首个字符必须为字母开头(a-z、A-Z)。 不能以数字开头。 中间不能有空格。 可以使用下划线(_)。 不能使用(-)。 不能使用 标点符号 等。
[ root@qs shell]
[ root@qs shell]
1. 系统变量
主要是用于对 参数判断 和 命令返回值判断 时使用。
echo ---------- 系统变量 ----------
echo '$0' = $0
echo '$1' = $1
echo '$*' = $*
echo '$#' = $#
echo '$?' = $?
echo '$$' = $?
2. 环境变量
echo ---------- 系统变量 ----------
echo 'PATH' = $PATH
echo 'HOME' = $HOME
echo 'SHELL' = $SHELL
echo 'USER' = $USER
echo 'ID' = $ID
echo 'PWD' = $PWD
echo 'TERM' = $TERM
echo 'HOSTNAME' = $HOSTNAME
echo 'PS1' = $PS1
echo 'HISTSIZE' = $HISTSIZE
echo 'RANDOM' = $RANDOM
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
3. 用户变量
用户变量 又称为 局部变量,主要用在 Shell脚本内部 或者 临时局部 使用。
echo ---------- 用户变量 ----------
a = rivers
echo 'a' = $a
httpd_sort = httpd-2.4.6-97.tar
echo 'Httpd_sort' = $httpd_sort
BACK_DIR = /data/backup/
echo 'BACK_DIR' = $BACK_DIR
IP_ADDRESS = 10.0 .0.1
echo 'IP_ADDRESS' = $IP_ADDRESS
三、颜色背景色
echo ---------- 字体颜色 ----------
for i in { 31 .. 37 } ; do
echo -e "\033 [$i ;40mHello Shell!\033 [0m"
done
for i in { 41 .. 47 } ; do
echo -e "\033 [47;${i} mHello World!\033 [0m"
done
for i in { 1 .. 8 } ; do
echo -e "\033 [$i ;31;40mHello Java!\033 [0m"
done
四、流程控制语句
1. If 条件判断语句
If 条件判断语句,通常以 if开头,fi结尾。 也可加入 else 或 elif 进行多条件的判断。
echo ---------- If 条件判断语句 ----------
if [ -f /etc/passwd ]
then
echo ok
fi
if [ 10 -eq 10 ]
then
echo ok
fi
if [ 10 -eq 10 ]
then
echo 成立
else
echo 不成立
fi
if [ $1 -lt 20 ]
then
echo 小了
elif [ $1 -gt 20 ]
then
echo 大了
else
echo 相等
fi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
1.1 if 判断逻辑运算符
-f
-d
-eq
-ne
-lt
-gt
-le
-ge
-a
-o
-z
-x
||
&&
1.2 if 案例—单分支语句—判断crond进程是否在运行
echo ---------- if 案例—单分支语句—判断crond进程是否在运行 ----------
name = crond
num = $( ps -ef | grep $name | grep -vc grep )
if [ $num -eq 1 ] ; then
echo "$num running!"
else
echo "$num is not running!"
fi
1.3 if 案例—单分支语句—判断系统目录是否存在
echo ---------- if 案例—单分支语句—判断系统目录是否存在 ----------
if [ -d /root/test -o -d /root/demo ] ; then
mkdir -p /root/demo
fi
1.4 if 案例—多分支语句—判断学生分数等级
echo ---------- if 案例—多分支语句—判断学生分数等级 ----------
grade = $1
if [ $grade -gt 90 ] ; then
echo "Is's very good!"
elif [ $grade -gt 70 ] ; then
echo "Is's is good!"
elif [ $grade -ge 60 ] ; then
echo "pass"
else
echo "no pass"
fi
2. for 循环语句
for '变量名' in '取值列表' ; do
'语句1'
done
2.1 for 案例—检查同一局域网内,多个主机是否存活
echo ---------- for 案例—检查同一局域网内,多台主机是否存活 ----------
Network = $1
for Host in $( seq 1 254 )
do
ping -c 1 $Network . $Host > /dev/null && result = 0 || result = 1
if [ "$result " == 0 ] ; then
echo -e "\033 [32;1m$Network .$Host is up \033 [0m"
echo "$Network .$Host " >> /tmp/up.txt
else
echo -e "\033 [;31m$Network .$Host is down \033 [0m"
echo "$Network .$Host " >> /tmp/down.txt
fi
done
./ping.sh 127.0 .0.1
3. while 循环语句
while ( '表达式' )
do
'语句1'
done
3.1 while 循环—break 和 continue 语句
echo ---------- while 案例—在死循环中,满足条件终止循环 ----------
while true ; do
let N++
if [ $N -eq 5 ] ; then
break
fi
echo $N
done
echo ---------- while 案例—continue ----------
N = 0
while [ $N -lt 5 ] ; do
let N++
if [ $N -eq 3 ] ; then
continue
fi
echo $N
done
echo ---------- while 案例—打印1-5数字 ----------
i = 0
while (( i<= 5 ))
do
echo $i
i = ` expr $i + 1 `
done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
3.2 while 案例—循环求1-100的总和
echo ---------- while 案例—循环求1-100的总和 ----------
j = 0
i = 1
while (( i<= 100 ))
do
j = ` expr $i + $j`
(( i++ ))
done
echo $j
3.3 while 案例—循环每10秒判断系统登录
echo ---------- while 案例—循环每10秒判断系统登录 ----------
USERS = "qs"
while true
do
echo "The Time is ` date +%F-%T` "
sleep 10
NUM = ` who | grep "$USERS " | wc -l`
if [ [ $NUM -ge 1 ] ] ; then
echo "The $USERS is login in system."
fi
done
4. case 选择语句
case '模式名' in
'模式1' )
'命令'
; ;
'模式2' )
'命令'
; ;
*)
'不符合以上模式,执行的命令'
esac
4.1 case 案例—编写http服务启动脚本
echo ---------- case 案例—编写http服务启动脚本 ----------
while true ;
do
echo -e "
\033 [31m start \033 [0m
\033 [32m stop \033 [0m
\033 [33m status \033 [0m
\033 [34m quit \033 [0m
"
read -p "请输入您的选择 [start|stop|quit]:" char
case $char in
start)
systemctl start httpd && echo "httpd服务已经开启" || echo "开启失败"
; ;
stop)
systemctl stop httpd && echo "httpd服务已经关闭" || echo "关闭失败"
; ;
restart)
systemctl restart httpd && echo "httpd服务已经重启" || echo "重启失败"
; ;
status)
systemctl status httpd && echo -e "httpd服务状态"
; ;
quit)
echo -e "httpd服务退出"
; ;
*)
echo -e "httpd服务"
; ;
esac
done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
5. select 选择语句
select i in ( '表达式' )
do
'语句'
done
5.1 select 案例—选择MySQL版本
echo ---------- select 案例—选择MySQL版本 ----------
PS3 = "Select a number: "
while true ; do
select mysql_version in 5.1 5.6 quit;
do
case $mysql_version in
5.1 )
echo "mysql 5.1"
break
; ;
5.6 )
echo "mysql 5.6"
break
; ;
quit)
exit
; ;
*)
echo "Input error, Please enter again!"
break
esac
done
done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
5.2 select 案例—打印lnmp菜单栏
echo ---------- select 案例—打印lnmp菜单栏 ----------
PS3 = "Please enter you select install menu: "
select i in http php mysql quit
do
case $i in
http)
echo -e "\033 [31m Test Httpd \033 [0m"
; ;
php)
echo -e "\033 [32m Test PHP\033 [0m"
; ;
mysql)
echo -e "\033 [33m Test MySQL.\033 [0m"
; ;
quit)
echo -e "\033 [32m The System exit.\033 [0m"
exit
esac
done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
五、函数 和 数组
1. 函数
func ( ) {
command1
command1
.. .
}
func
1.1 函数案例
echo ---------- 函数案例 ----------
func ( ) {
VAR = $(( 1 + 1 ))
return $VAR
echo "This is a function."
}
func
echo $?
1.2 函数案例—创建Apache软件安装
echo ---------- 函数案例—创建Apache软件安装 ----------
FILES = httpd-2.2.31.tar.bz2
LES_DIR = httpd-2.2.31
URL = http://mirrors.cnnic.cn/apache/httpd/
PREFIX = /usr/local/apache2/
function Apache_install ( ) {
if [ [ "$1 " -eq "1" ] ] ; then
wget -c $URL /$FILES && tar -jxvf $FILES && cd $FILES_DIR && ./configure
if [ $? -eq 0 ] ; then
make && make install
echo -e "\n \033 [32m--------------------------------------------
echo -e " \ 033[ 32mThe $FILES_DIR Server Install Success ! \ 033[ 0m
else
echo -e "\ 033[ 32mThe $FILES_DIR Make or Make install ERROR,Plea
exit 0
fi
fi
}
Apache_install 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
2. 数组
2.1 数组案例—遍历数组元素一
IP = ( 10.0 .0.1 10.0 .0.2 10.0 .0.3)
for (( i= 0 ; i< ${#IP[* ]}; i++ )) ; do
echo ${IP[ $i] }
done
10.0 .0.1
10.0 .0.2
10.0 .0.3
2.2 数组案例—遍历数组元素二
IP = ( 10.0 .0.1 10.0 .0.2 10.0 .0.3)
for IP in ${IP[ *] } ; do
echo $IP
done
六、Shell 案例
1. 案例—系统备份脚本
Tar工具全备、增量备份网站,Shell脚本 实现自动打包备份。
#!/bin/bash
SOURCE_DIR = (
$*
)
TARGET_DIR = /data/backup/
YEAR = ` date +%Y`
MONTH = ` date +%m`
DAY = ` date +%d`
WEEK = ` date +%u`
A_NAME = ` date +%H%M`
FILES = system_backup.tgz
CODE = $?
if
[ -z "$* " ] ;then
echo -e "\033 [32mUsage:\n Please Enter Your Backup Files or Directories\n --------------------------------------------\n \n Usage: { $0 /boot /etc}\033 [0m"
exit
fi
if
[ ! -d $TARGET_DIR /$YEAR /$MONTH /$DAY ] ;then
mkdir -p $TARGET_DIR /$YEAR /$MONTH /$DAY
echo -e "\033 [32mThe $TARGET_DIR Created Successfully !\033 [0m"
fi
Full_Backup ( )
{
if
[ "$WEEK " -eq "7" ] ;then
rm -rf $TARGET_DIR /snapshot
cd $TARGET_DIR /$YEAR /$MONTH /$DAY ;tar -g $TARGET_DIR /snapshot -czvf $FILES ${SOURCE_DIR[ @] }
[ "$CODE " == "0" ] && echo -e "--------------------------------------------\n \033 [32mThese Full_Backup System Files Backup Successfully !\033 [0m"
fi
}
Add_Backup ( )
{
if
[ $WEEK -ne "7" ] ;then
cd $TARGET_DIR /$YEAR /$MONTH /$DAY ;tar -g $TARGET_DIR /snapshot -czvf $A_NAME $FILES ${SOURCE_DIR[ @] }
[ "$CODE " == "0" ] && echo -e "-----------------------------------------\n \033 [32mThese Add_Backup System Files $TARGET_DIR /$YEAR /$MONTH /$DAY /${YEAR} _$A_NAME $FILES Backup Successfully !\033 [0m"
fi
}
sleep 3
Full_Backup;Add_Backup
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
2. 案例—服务器信息自动收集
cat << EOF
++++++++++++++++++++++++++++++++++++++++++++++
++++++++Welcome to use system Collect+++++++++
++++++++++++++++++++++++++++++++++++++++++++++
EOF
ip_info = ` ifconfig | grep "Bcast" | tail -1 | awk '{print $2}' | cut -d: -f 2 `
cpu_info1 = ` cat /proc/cpuinfo | grep 'model name' | tail -1 | awk -F: '{print $2}' | sed 's/^ //g' | awk '{print $1,$3,$4,$NF}' `
cpu_info2 = ` cat /proc/cpuinfo | grep "physical id" | sort | uniq -c| wc -l`
serv_info = ` hostname | tail -1`
disk_info = ` fdisk -l| grep "Disk" | grep -v "identifier" | awk '{print $2,$3,$4}' | sed 's/,//g' `
mem_info = ` free -m | grep "Mem" | awk '{print "Total",$1,$2"M"}' `
load_info = ` uptime | awk '{print "Current Load: "$(NF-2)}' | sed 's/\,//g' `
mark_info = 'BeiJing_IDC'
echo -e "\033 [32m-------------------------------------------\033 [1m"
echo IPADDR:${ip_info}
echo HOSTNAME : $serv_info
echo CPU_INFO:${cpu_info1} X${cpu_info2}
echo DISK_INFO:$disk_info
echo MEM_INFO:$mem_info
echo LOAD_INFO:$load_info
echo -e "\033 [32m-------------------------------------------\033 [0m"
echo -e -n "\033 [36mYou want to write the data to the databases? \033 [1m" ;read ensure
if [ "$ensure " == "yes" -o "$ensure " == "y" -o "$ensure " == "Y" ] ; then
echo "--------------------------------------------"
echo -e '\033[31mmysql -uaudit -p123456 -D audit -e ' '' "insert into audit_system values(' ','${ip_info}' ,'$serv_info' ,'${
cpu_info1} X${cpu_info2}' ,'$disk_info' ,'$mem_info' ,'$load_info' ,'$mark_info' ) " ''' \033 [0m '
mysql -uroot -p123456 -D test -e " insert into audit_system values( '' ,'${ip_info}' ,'$serv_info' ,'${cpu_info1} X${cpu_info2}
' ,'$disk_info' ,'$mem_info' ,'$load_info' ,'$mark_info' ) "
else
echo " Please wait,exit.. .. .. "
exit
fi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
3. 案例—一键批量部署lnmp架构
[ root@web-server01~/script]
Nginx_url = https://nginx.org/download/nginx-1.20.1.tar.gz
Nginx_prefix = /usr/local/nginx
Mysql_version = mysql-5.5.20.tar.gz
Mysql_dir = mysql-5.5.20
Mysql_url = https://downloads.mysql.com/archives/get/p/23/file/mysql-5.5.20.tar.gz
Mysql_prefix = /usr/local/mysql/
Php_version = php-7.2.10.tar.gz
Php_prefix = /usr/local/php-7.2.10/
function nginx_install ( ) {
if [ [ "$1 " -eq "1" ] ] ; then
if [ $? -eq 0 ] ; then
make && make install
fi
fi
}
function mysql_install ( ) {
if [ [ "$1 " -eq "2" ] ] ; then
-DMYSQL_UNIX_ADDR= /tmp/mysql.sock \
-DMYSQL_DATADIR= /data/mysql \
-DSYSCONFDIR= /etc \
-DMYSQL_USER= mysql \
-DMYSQL_TCP_PORT= 3306 \
-DWITH_XTRADB_STORAGE_ENGINE= 1 \
-DWITH_INNOBASE_STORAGE_ENGINE= 1 \
-DWITH_PARTITION_STORAGE_ENGINE= 1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE= 1 \
-DWITH_MYISAM_STORAGE_ENGINE= 1 \
-DWITH_READLINE= 1 \
-DENABLED_LOCAL_INFILE= 1 \
-DWITH_EXTRA_CHARSETS= 1 \
-DDEFAULT_CHARSET= utf8 \
-DDEFAULT_COLLATION= utf8_general_ci \
-DEXTRA_CHARSETS= all \
echo -e "\033 [32mThe $Mysql_dir Server Install Success !\033 [0m"
else
echo -e "\033 [32mThe $Mysql_dir Make or Make install ERROR,Please Check......"
exit 0
fi
/bin/cp support-files/my-small.cnf /etc/my.cnf
/bin/cp support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
fi
}
function php_install ( ) {
if [ [ "$1 " -eq "3" ] ] ; then
if [ $? -eq 0 ] ; then
make ZEND_EXTRA_LIBS = '-liconv' && make install
if [ [ "$1 " -eq "3" ] ] ; then
wget $Php_url && tar xf $Php_version && cd $Php_dir && yum install bxml2* bzip2* libcurl* libjpeg* libpng* freetype* gmp* libm
crypt* readline* libxslt* -y && ./configure --prefix= $Php_prefix --disable-fileinfo --enable-fpm --with-config-file-path= /etc --wi
-config-file-scan-dir= /etc/php.d --with-openssl --with-zlib --with-curl --enable-ftp --with-gd --with-xmlrpc --with-jpeg-dir --w
ith-png-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mcrypt= /usr/local/libmcrypt --enable-zip --enable-
mysqlnd --with-mysqli= mysqlnd --with-pdo-mysql= mysqlnd --with-mysql-sock= /var/lib/mysql/mysql.sock --without-pear --enable-bcmath
if [ $? -eq 0 ] ; then
make ZEND_EXTRA_LIBS = '-liconv' && make install
echo -e "\n \033 [32m-----------------------------------------------\033 [0m"
echo -e "\033 [32mThe $Php_version Server Install Success !\033 [0m"
else
echo -e "\033 [32mThe $Php_version Make or Make install ERROR,Please Check......"
exit 0
fi
fi
}
PS3 = "Please enter you select install menu:"
select i in nginx mysql php quit
do
"lnmp.sh" 113L, 3516C written
[ root@web-server01~/script]
chkconfig --add mysqld
chkconfig mysqld on
fi
}
function php_install ( ) {
if [ [ "$1 " -eq "3" ] ] ; then
if [ $? -eq 0 ] ; then
make ZEND_EXTRA_LIBS = '-liconv' && make install
echo -e "\n \033 [32m-----------------------------------------------\033 [0m"
echo -e "\033 [32mThe $Php_version Server Install Success !\033 [0m"
else
echo -e "\033 [32mThe $Php_version Make or Make install ERROR,Please Check......"
exit 0
fi
fi
}
PS3 = "Please enter you select install menu:"
select i in nginx mysql php quit
do
case $i in
nginx)
nginx_install 1
; ;
mysql)
mysql_install 2
; ;
php)
php_install 3
; ;
quit)
exit
esac
done
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129