shell
一、shell概述
shell是操作系统的最外层,可以合并编程语言一控制进程和文件,以及启动和控制其他程序。shell通过提示输入,向操作系统解释该输入。shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。
Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。
Linux提供的shell解析器
1 2 3 4 5 6 | root@zhangkun:~ # cat /etc/shells / bin / sh / bin / bash / usr / bin / bash / bin / dash / usr / bin / dash |
1 2 | root@zhangkun:~ # echo $SHELL / bin / bash |
二、第一个shell脚本
先新建一个sh脚本文件
1 2 3 | root@zhangkun:~ # mkdir study root@zhangkun:~ / study # touch hello.sh root@zhangkun:~ / study # vi hello.sh |
在helloworld.sh中输入如下内容
1 2 | #!/bin/bash echo "Hello,world" |
脚本常用的执行方式
Linux shell种类非常多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。
最常用的shell是Bash,也就是Bourne Again Shell,是大多是Linux系统默认的Shell。
1、第一种采用bash或sh+脚本的相对路径或者绝对路径(不用赋予脚本+x权限)
sh+脚本的相对路径
1 2 | root@zhangkun:~ / study # sh hello.sh Hello,world |
sh+脚本的绝对路径
1 2 | root@zhangkun:~ / study # sh /root/study/hello.sh Hello,world |
bash+脚本的相对路径
1 2 | root@ zhangkun:~ / study # bash hello.sh Hello,world |
bash+脚本的绝对路径
1 2 | root@ zhangkun:~ / study # bash /root/study/hello.sh Hello,world |
2、第二种:采用输入脚本的绝对路径和相对路径执行脚本(必须具有可执行权限+x)
1、首先赋予helloworld.sh脚本+x权限
1 | root@zhangkun:~ / study # chmod +x hello.sh |
2、./+脚本名
1 2 | root@zhangkun:~ / study # ./hello.sh Hello,world |
3、/+绝对路径
1 2 | root@ zhangkun:~ / study # /root/study/hello.sh Hello,world |
第三种:在脚本的路径前加上”. ”或者source命令
1 2 3 4 5 6 | root@zhangkun:~ / study # source hello.sh Hello,world root@zhangkun:~ / study # source /root/study/hello.sh Hello,world root@zhangkun:~ / study # . hello.sh Hello,world |
source是shell的内嵌
1 2 3 | root@zhangkun:~ / study # type source source is a shell builtin |
前两种都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
第三种,也就是使用在脚本路径前加”.”或者source的方式,可以使脚本内容在当前shell里执行,而无需打开子shell,也就是为什么我们每次修改完/etc/profile文件以后,需要source一下的原因。
三、父子shell
查看bash进程
1 2 3 4 | root@zhangkun:~ / study # ps -f UID PID PPID C STIME TTY TIME CMD root 1623611 1623417 0 Jul16 pts / 4 00 : 00 : 00 - bash root 2973460 1623611 0 16 : 18 pts / 4 00 : 00 : 00 ps - f |
在敲一下bash,生成一个bash的子进程
1 2 3 4 5 6 | root@ zhangkun:~ / study # bash root@ zhangkun:~ / study # ps -f UID PID PPID C STIME TTY TIME CMD root 1623611 1623417 0 Jul16 pts / 4 00 : 00 : 00 - bash root 2975205 1623611 0 16 : 19 pts / 4 00 : 00 : 00 bash root 2975216 2975205 0 16 : 19 pts / 4 00 : 00 : 00 ps - f |
后面进行的操作是在子shell中进行。
然后执行exit退出子shell
1 2 3 4 5 6 | root@zhangkun:~ / study # exit exit root@zhangkun:~ / study # ps -f UID PID PPID C STIME TTY TIME CMD root 1623611 1623417 0 Jul16 pts / 4 00 : 00 : 00 - bash root 2979056 1623611 0 16 : 21 pts / 4 00 : 00 : 00 ps - f |
开子shell和不开子shell的区别在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell中是不可见的。
四、变量
shell编程语言是非典型的解释型语言,不像C++/Java语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以使用赋值符号(=)为变量赋值。
SHELL变量可分为两类:局部变量和环境变量,局部变量只在创建它们的shell脚本中使用,而环境变量则可以再创建它们的shell以及其派生出来的任意子进程中使用,有些变量使用户创建的,其他的则是专用shell变量。
4.1 系统预定义变量
(1)常用系统变量
$HOME、$PWD、$SHELL、$USER等。
$0 当前程序的名称
$n 当前程序的第n个参数,n=1,2,....9
$* 当前程序的所有参数(不包括程序本身)
$? 命令或程序执行完后的状态,一般返回0表示执行成功。
$UID 当前用户的ID
$PWD 当前所在的目录
$#:表示执行脚本传入参数的个数
(2) 案例实操
查看系统变量的值
1 2 3 4 5 6 7 8 9 | root@zhangkun:~ / study # env root@zhangkun:~ / study # echo $HOME / root root@zhangkun:~ / study # echo $PWD / root / study root@zhangkun:~ / study # printenv root@zhangkun:~ / study # echo $USER root root@zhangkun:~ / study # printenv | less |
查看所有的变量
1 | root@zhangkun:~ / study # set |
输出所有参数、执行结果和参数个数
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash # author print variables echo -e '\033[32m----------------------\033[0m' echo "This is $0 param !" echo "This is \$1 is $1 param !" echo "This is \$2 is $2 param !" echo -e '\033[32m----------------------\033[0m' echo "This is \$# is $# param !" echo "This is \$* is $* param !" echo "This is \$? is $? param !" |
运行结果如下:
(3)LAMP导航菜单编写
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash #by authors zk echo -e "\033[32mPlease select Menu follow:\033[1m" echo "1)install apache server" echo "2)install Mysql server" echo "3)install PHP server" echo "4)install LAMP WEB " echo "--------------------------------------------" |
输出结果如下:
4.2 用户自定义变量
(1)基本语法
1、定义变量:变量名=变量值,注意,=号前后不能有空格
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 | root@zhangkun: / # a=2 root@ zhangkun: / # echo $a 2 root@ zhangkun: / # echo $my_var root@ zhangkun: / # my_var=hello root@ zhangkun: / # echo $my_var hello root@ zhangkun: / # my_var='Hello,world' root@ zhangkun: / # echo $my_var Hello,world root@ zhangkun: / # my_var="Hello,world" root@ zhangkun: / # echo $my_var Hello,world #自定义变量是一个局部变量 root@ zhangkun: / # env | grep $my_var root@ zhangkun: / # set | grep $my_var _ = Hello,world my_var = Hello,world #定义一个全局变量,变量升级 root@ zhangkun: / # export my_var root@ zhangkun: / # echo $my_var Hello,world #切换进入子shell root@ zhangkun: / # bash root@ zhangkun: / # echo $my_var Hello,world #如果在子shell中更改变量的值只会在子shell中有效 root@ zhangkun: / # echo $my_var Hello,world root@ zhangkun: / # bash root@ zhangkun: / # my_var='Hello' root@ zhangkun: / # echo $my_var Hello root@ zhangkun: / # exit exit root@ zhangkun: / # echo $my_var Hello,world |
用户自定义变量
五、IF条件控制语句
在Linux Shell编程中,if、for、while、case等条件流程控制语句用的非常多。
1 2 3 4 5 | IF (表达式) #if(Variable in Array) 语句 1 else 语句 2 fi |
例一:判断数字大小
1 2 3 4 5 6 7 8 | #!/bin/bash NUM1 = 100 NUM2 = 200 if (($NUM2 > $NUM1));then echo "$NUM2 greater $NUM1!" fi |
运行结果如下:
逻辑运算符解析:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | - f 判断文件是否存在 eg: if [ - f file name ] - d 判断目录是否存在 eg: if [ - d dir ] - eq 等于 应用于:整型比较 - ne 不等于 应用于:整型比较 - lt 小于 应用于:整型比较 - gt 大于 应用于:整型比较 - le 小于或等于 应用于:整型比较 - ge 大于或等于 应用于:整型比较 - a 双方都成立( and )逻辑表达式 - a 逻辑表达式 - o 单方成立( or )逻辑表达式 - o 逻辑表达式 - z 空字符串 |
例二:判断目录是否存在,如果目录不存在则创建
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash # judge dir exists dir = ~ / Desktop / test if [ - d $ dir ];then echo "test exist" else mkdir - p $ dir echo "$dir mkdir success" fi |
运行结果如下:
例三:判断文件是否存在,如果存在,打印输出,如果不存在创建文件
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash filename = "file.txt" if [ ! - f $filename ];then echo "OK" >> $filename else echo "file is exists" cat $filename fi |
运行结果如下:
例四:根据分数判断成绩等级
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/bin/bash score = $ 1 if [ - z $score ];then echo "Usage:{60|80}" exit fi if [[ $score - gt 85 ]];then echo "very good" elif [[ $score - gt 75 ]];then echo "good" elif [[ $score - gt 60 ]];then echo "pass" else echo "no pass" fi |
运行结果如下:
例五:使用if条件语句编写Mysql备份脚本
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 | #!/bin/bash # auto backup mysql db # by author zk DATE = $(date + % F - % H - % M - % S) echo $DATE MYSQLDB = school BAK_DIR = / root / data / backup / ${MYSQLDB}_${DATE} echo $BAK_DIR MYSQLUSR = root MYSQLPW = 123456 MYSQLCMD = / usr / bin / mysqldump if [ $UID - ne 0 ];then echo "Must to be use root for exec shell." fi if [ ! - d $BAK_DIR ];then mkdir - p $BAK_DIR echo - e "\033[32mThe $BAK_DIR Create Successfully!" else echo "This $BAK_DIR is exists..." fi $MYSQLCMD - u$MYSQLUSR - p$MYSQLPW - d $MYSQLDB >$BAK_DIR / $MYSQLDB.sql if [ $? - eq 0 ];then echo - e "\033[32mThe Mysql Backup $MYSQLDB Successfully!" else echo - e "\033[32mThe Mysql Backup $MYSQLDB Failed,Please check!" fi |
先使用sh -n检查脚本是否存在问题
然后执行脚本
执行成功
可以看到备份sql
看一下备份sql的内容
指定每日备份计划
输入如下代码
1 | 0 0 * * * / bin / bash / home / zk / Desktop / shelltext / mysql_bak.sh >> / tmp / mysql_bak.log 2 >& 1 |
指定每日0点0分执行mysql_bak.sh备份数据库
例六:if条件综合LAMP一键安装脚本
一键源码安装LAMP脚本,先分解任务:
打印菜单
(1)安装apache WEB服务器
(2)安装Mysql DB服务器
(3)安装PHP服务器
(4)整合LAMP架构并启动服务
(1)安装apache WEB服务器
下载httpd-2.4.62.tar.bz2版本,下载URL,解压,进入安装目录,configure;make ; make install
遇到过如下错误
错误一:
1 | checking for APR... no configure: error: APR not found. Please read the documentation. |
这个错误需要先安装APR,在脚本里实现
错误二:
1 | error: no acceptable C compiler found in $PATH |
这个错误需要安装GCC
1 | zk@zk - None :~ / Desktop / shelltext$ sudo apt install gcc |
错误三:
1 | LAMP.sh: line 37 : make: command not found |
一般出现这个-bash: make: command not found提示,系统没有安装make等常用命令,直接sudo apt-get install安装下即可。
解决方法:
1 2 | sudo apt - get update sudo apt - get install gcc automake autoconf libtool make |
错误四:
1 | xml / apr_xml.c: 35 : 10 : fatal error: expat.h: No such file or directory |
解决方法:
1 2 | sudo apt - get update sudo apt - get install libexpat1 - dev |
错误五:安装pcre时
1 | configure: error: Invalid C + + compiler or C + + compiler flags |
解决方法:
1 2 | sudo apt - update sudo apt - get install g + + |
安装apache web服务器LAMP.sh
错误六:启动apache报错
1 | AH00558: httpd: Could not reliably determine the server 's fully qualified domain name, using 127.0.1.1. Set the ' ServerName' directive globally to suppress this message |
到httpd目录下配置httpd.conf中Servername
1 | ServerName localhost: 80 |
(1)安装apache服务器的脚本LAMP.sh
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 | #!/bin/bash # auto make install LAMP # by authors zk # HTTP define path variable H_PREFIX_APACHE = / usr / local / apache H_FILES_HTTPD = httpd - 2.4 . 62.tar .bz2 H_FILES_HTTPD_DIR = httpd - 2.4 . 62 H_HTTPD_URL = https: / / mirrors.tuna.tsinghua.edu.cn / apache / httpd / H_PREFIX_HTTPD = / usr / local / apache / httpd / H_FILES_APR = apr - 1.6 . 5.tar .bz2 H_FILES_APR_DIR = apr - 1.6 . 5 H_APR_URL = http: / / mirrors.tuna.tsinghua.edu.cn / apache / apr / H_PREFIX_APR = / usr / local / apache / apr / H_FILES_APR_UTIL = apr - util - 1.6 . 3.tar .bz2 H_FILES_APR_UTIL_DIR = apr - util - 1.6 . 3 H_APR_UTIL_URL = http: / / mirrors.tuna.tsinghua.edu.cn / apache / apr / H_PREFIX_APR_UTIL = / usr / local / apache / apr - util / H_FILES_PCRE = pcre - 8.45 .tar.gz H_FILES_PCRE_DIR = pcre - 8.45 H_PCRE_URL = https: / / sourceforge.net / projects / pcre / files / pcre / 8.45 / H_PREFIX_PCRE = / usr / local / apache / pcre / H_FILES_PCRE2 = pcre2 - 10.37 .tar.gz H_FILES_PCRE2_DIR = pcre2 - 10.37 H_PCRE2_URL = https: / / sourceforge.net / projects / pcre / files / pcre2 / 10.37 / H_PREFIX_PCRE2 = / usr / local / apache / pcre2 / if [ - z "$1" ];then echo - e "\033[36mPlease Select Install Menu follow:\033[0m" echo - e "\033[32m1)install apache server\033[1m" echo - e "\033[32m2)install Mysql server\033[1m" echo - e "\033[32m3)install PHP server\033[1m" echo - e "\033[31mUsage:{ /bin/sh $0 1|2|3|help}\033[0m" exit fi if [[ "$1" - eq "help" ]];then echo - e "\033[36mPlease Select Install Menu follow:\033[0m" echo - e "\033[32m1)install apache server\033[1m" echo - e "\033[32m2)install Mysql server\033[1m" echo - e "\033[32m3)install PHP server\033[1m" echo - e "\033[31mUsage:{ /bin/sh $0 1|2|3|help}\033[0m" exit fi if [[ "$1" - eq "1" ]];then wget - c $H_APR_URL / $H_FILES_APR &&tar - jxvf $H_FILES_APR &&cd $H_FILES_APR_DIR ;. / configure - - prefix = $H_PREFIX_APR if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_APR_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_APR_DIR Server Install Failed,Please check...!\033[0m" exit fi wget - c $H_APR_UTIL_URL / $H_FILES_APR_UTIL &&tar - jxvf $H_FILES_APR_UTIL &&cd $H_FILES_APR_UTIL_DIR ;. / configure - - prefix = $H_PREFIX_APR_UTIL - - with - apr = $H_PREFIX_APR if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_APR_UTIL_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_APR_UTIL_DIR Server Install Failed,Please check...!\033[0m" exit fi wget - c $H_PCRE_URL / $H_FILES_PCRE &&tar - zxvf $H_FILES_PCRE &&cd $H_FILES_PCRE_DIR ;. / configure - - prefix = $H_PREFIX_PCRE - - with - apr = $H_PREFIX_APR if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_PCRE_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_PCRE_DIR Server Install Failed,Please check...!\033[0m" exit fi wget - c $H_PCRE2_URL / $H_FILES_PCRE2 &&tar - zxvf $H_FILES_PCRE2 &&cd $H_FILES_PCRE2_DIR ;. / configure - - prefix = $H_PREFIX_PCRE2 - - with - apr = $H_PREFIX_APR if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_PCRE2_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_PCRE2_DIR Server Install Failed,Please check...!\033[0m" exit fi export PATH = $PATH:$H_PREFIX_PCRE echo $PATH wget - c $H_HTTPD_URL / $H_FILES_HTTPD &&tar - jxvf $H_FILES_HTTPD &&cd $H_FILES_HTTPD_DIR ;. / configure - - prefix = $H_PREFIX_HTTPD - - with - apr = $H_PREFIX_APR - - with - apr - util = $H_PREFIX_APR_UTIL - - enable - so - - enable - mods - shared = most - - with - pcre = $H_PREFIX_PCRE - - with - pcre2 = $H_PREFIX_PCRE2 if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_HTTPD_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_HTTPD_DIR Server Install Failed,Please check...!\033[0m" exit fi fi |
执行完以上脚本后,启动apache服务器
1 2 3 4 | root@zk - None : / usr / local / apache / httpd / bin # /usr/local/apache/httpd/bin/apachectl -k start httpd (pid 351155 ) already running root@zk - None : / usr / local / apache / httpd / bin # /usr/local/apache/httpd/bin/apachectl -k stop root@zk - None : / usr / local / apache / httpd / bin # /usr/local/apache/httpd/bin/apachectl -k start |
查看到80端口正在监听
1 2 3 4 5 6 7 8 9 10 | root@zk - None : / usr / local / apache / httpd / bin # netstat -lnt Active Internet connections (only servers) Proto Recv - Q Send - Q Local Address Foreign Address State tcp 0 0 127.0 . 0.1 : 3306 0.0 . 0.0 : * LISTEN tcp 0 0 127.0 . 0.53 : 53 0.0 . 0.0 : * LISTEN tcp 0 0 127.0 . 0.1 : 631 0.0 . 0.0 : * LISTEN tcp 0 0 127.0 . 0.1 : 33060 0.0 . 0.0 : * LISTEN tcp 0 0 127.0 . 0.54 : 53 0.0 . 0.0 : * LISTEN tcp6 0 0 :: 1 : 631 ::: * LISTEN tcp6 0 0 ::: 80 ::: * LISTEN |
访问localhost:80
apache服务器安装成功。
(2)安装Mysql DB服务器
安装mysql服务器脚本LAMP.sh
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 | #!/bin/bash # auto make install LAMP # by authors zk # HTTP define path variable H_PREFIX_APACHE = / usr / local / apache H_FILES_HTTPD = httpd - 2.4 . 62.tar .bz2 H_FILES_HTTPD_DIR = httpd - 2.4 . 62 H_HTTPD_URL = https: / / mirrors.tuna.tsinghua.edu.cn / apache / httpd / H_PREFIX_HTTPD = / usr / local / apache / httpd / H_FILES_APR = apr - 1.6 . 5.tar .bz2 H_FILES_APR_DIR = apr - 1.6 . 5 H_APR_URL = http: / / mirrors.tuna.tsinghua.edu.cn / apache / apr / H_PREFIX_APR = / usr / local / apache / apr / H_FILES_APR_UTIL = apr - util - 1.6 . 3.tar .bz2 H_FILES_APR_UTIL_DIR = apr - util - 1.6 . 3 H_APR_UTIL_URL = http: / / mirrors.tuna.tsinghua.edu.cn / apache / apr / H_PREFIX_APR_UTIL = / usr / local / apache / apr - util / H_FILES_PCRE = pcre - 8.45 .tar.gz H_FILES_PCRE_DIR = pcre - 8.45 H_PCRE_URL = https: / / sourceforge.net / projects / pcre / files / pcre / 8.45 / H_PREFIX_PCRE = / usr / local / apache / pcre / H_FILES_PCRE2 = pcre2 - 10.37 .tar.gz H_FILES_PCRE2_DIR = pcre2 - 10.37 H_PCRE2_URL = https: / / sourceforge.net / projects / pcre / files / pcre2 / 10.37 / H_PREFIX_PCRE2 = / usr / local / apache / pcre2 / if [ - z "$1" ];then echo - e "\033[36mPlease Select Install Menu follow:\033[0m" echo - e "\033[32m1)install apache server\033[1m" echo - e "\033[32m2)install Mysql server\033[1m" echo - e "\033[32m3)install PHP server\033[1m" echo - e "\033[31mUsage:{ /bin/sh $0 1|2|3|help}\033[0m" exit fi if [[ "$1" - eq "help" ]];then echo - e "\033[36mPlease Select Install Menu follow:\033[0m" echo - e "\033[32m1)install apache server\033[1m" echo - e "\033[32m2)install Mysql server\033[1m" echo - e "\033[32m3)install PHP server\033[1m" echo - e "\033[31mUsage:{ /bin/sh $0 1|2|3|help}\033[0m" exit fi if [[ "$1" - eq "1" ]];then wget - c $H_APR_URL / $H_FILES_APR &&tar - jxvf $H_FILES_APR &&cd $H_FILES_APR_DIR ;. / configure - - prefix = $H_PREFIX_APR if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_APR_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_APR_DIR Server Install Failed,Please check...!\033[0m" exit fi wget - c $H_APR_UTIL_URL / $H_FILES_APR_UTIL &&tar - jxvf $H_FILES_APR_UTIL &&cd $H_FILES_APR_UTIL_DIR ;. / configure - - prefix = $H_PREFIX_APR_UTIL - - with - apr = $H_PREFIX_APR if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_APR_UTIL_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_APR_UTIL_DIR Server Install Failed,Please check...!\033[0m" exit fi wget - c $H_PCRE_URL / $H_FILES_PCRE &&tar - zxvf $H_FILES_PCRE &&cd $H_FILES_PCRE_DIR ;. / configure - - prefix = $H_PREFIX_PCRE - - with - apr = $H_PREFIX_APR if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_PCRE_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_PCRE_DIR Server Install Failed,Please check...!\033[0m" exit fi wget - c $H_PCRE2_URL / $H_FILES_PCRE2 &&tar - zxvf $H_FILES_PCRE2 &&cd $H_FILES_PCRE2_DIR ;. / configure - - prefix = $H_PREFIX_PCRE2 - - with - apr = $H_PREFIX_APR if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_PCRE2_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_PCRE2_DIR Server Install Failed,Please check...!\033[0m" exit fi export PATH = $PATH:$H_PREFIX_PCRE echo $PATH wget - c $H_HTTPD_URL / $H_FILES_HTTPD &&tar - jxvf $H_FILES_HTTPD &&cd $H_FILES_HTTPD_DIR ;. / configure - - prefix = $H_PREFIX_HTTPD - - with - apr = $H_PREFIX_APR - - with - apr - util = $H_PREFIX_APR_UTIL - - enable - so - - enable - mods - shared = most - - with - pcre = $H_PREFIX_PCRE - - with - pcre2 = $H_PREFIX_PCRE2 if [ $? - eq 0 ];then make && make install echo - e "\033[32mThe $H_FILES_HTTPD_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_HTTPD_DIR Server Install Failed,Please check...!\033[0m" exit fi fi if [[ "$1" - eq "2" ]];then sudo systemctl stop mysql sudo apt - get remove - - purge mysql - server mysql - client mysql - common sudo rm - rf / etc / mysql / var / lib / mysql sudo apt - get autoremove sudo apt - get autoclean sudo apt - get remove - - purge mysql - * sudo apt update sudo apt install mysql - server mysql - client if [ $? - eq 0 ];then echo - e "\033[32mThe $H_FILES_MYSQL_DIR Server Install Successfully!\033[0m" else echo - e "\033[32mThe $H_FILES_MYSQL_DIR Server Install Failed,Please check...!\033[0m" exit fi fi |
运行脚本LAMP.sh后,输入mysql登录数据库
1 2 3 | root@zk - None :~ # mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7 . 33 - 0ubuntu0 . 16.04 . 1 (Ubuntu) Copyright (c) 2000 , 2021 , Oracle and / or its affiliates. Oracle is a registered trademark of Oracle Corporation and / or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help . Type '\c' to clear the current input statement. mysql> |
(3)安装PHP服务器
在LAMP.sh中配置安装PHP服务器功能
六、for循环语句
1 2 3 4 | For 变量 in 字符串 do 语句 1 done |
例一:打印seq数字循环
1 2 3 4 5 | #!/bin/bash for i in $(seq 1 15 ); do echo - e "\033[32mThe Num is $i\033[32m" done |
运行结果如下:
例二:求和1-100的值
1 2 3 4 5 6 7 8 | #!/bin/bash # auto sum 1 100 j = 0 for ((i = 1 ;i< = 100 ;i + + )); do j = $(($i + $j)) done echo $j |
1 2 3 4 5 6 7 8 9 | #!/bin/bash # auto sum 1 100 j = 0 for ((i = 1 ;i< = 100 ;i + + )); do #j=$(($i+$j)) j = $(expr $j + $i) done echo $j |
运行结果如下:
例三:批量打包sh文件
1 2 3 4 5 6 | #!/bin/bash for i in `find * . - maxdepth 1 - name "*.sh" ` do tar - czvf $i.tgz $i done |
运行结果如下:
例四:批量解压文件
1 2 3 4 5 6 7 | #!/bin/bash for i in `find * . - maxdepth 1 - name "*.tgz" ` do tar - xzvf $i - C / home / zk / Desktop / shelltext done |
执行前
执行后
例五:服务器远程批量传输文件
首先需要开放虚拟机中的22端口号
Linux 中 22 端口是 ssh 应用端口用以进行远程访问,正常情况下 Linux 服务器要打开 22 端口。
如下命令检查服务器是否启用 22 端口:
1 | netstat - tln | grep 22 |
如果结果出现 xxx:22 等结果则说明,22 端口已开启,否则需要手动开启。
开启 22 端口
首先,检查是否安装 SSH 服务器,执行如下命令
1 2 | sudo apt - get update sudo apt - get install openssh - server |
然后,开启服务器上的 22 端口。需要修改 SSH 服务器配置文件/etc/ssh/sshd_config
。执行如下命令:
1 | sudo vi / etc / ssh / sshd_config |
找到“#Port 22”一行,然后将其改为“Port 22”。
最后,需要重启SSH服务以使配置更改生效,执行如下命令:
1 | sudo service ssh restart |
再次执行
1 | netstat - tln | grep 22 |
检查 22 端口状态。如果开启,则可以通过 ssh 链接该服务器。
开启ssh服务
1 2 3 | systemctl enable ssh.service service sshd start |
查看ssh服务状态
1 | service ssh status |
Linux的ip地址是192.168.67.128
1 2 3 4 5 6 7 | #!/bin/bash #auto ssh ls /tmp #by authors zk 2024 for i in `echo 192.168 . 67.128 127.0 . 0.1 ` do scp / tmp / test.txt root@$i: / root / done |
在执行脚本的时候我遇到如下问题:
更改了/etc/ssh/sshd_config文件下的配置不好用
1 2 3 | root@zk - None : / home / zk / Desktop / shelltext # cat /etc/ssh/sshd_config | grep 'PermitRootLogin yes\|PasswordAuthentication yes' PermitRootLogin yes PasswordAuthentication yes |
最后更改了/etc/ssh/sshd_config下UsePAM解决问题
1 2 | root@zk - None : / var / log # cat /etc/ssh/sshd_config | grep 'UsePAM' UsePAM no |
可以看到文件已经从/tmp目录传输到/root目录下了
生成免密钥登陆
1 | root@zk - None : / home / zk / Desktop / shelltext # ssh-keygen |
先生成一个公钥,然后将生成的公钥拷贝过去
后续copy就不需要密码了
例六:远程主机批量执行命令
1 2 3 4 5 6 7 | #!/bin/bash #auto ssh ls /tmp #by authors zk 2024 for i in `seq 100 200 ` do ssh - l root 192.168 . 1. $i 'ls /tmp' done |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-07-18 hibernate和mybatis出现配置文件xml的文件报错Multiple annotations found at this line(转)
2019-07-18 Mysql实现级联操作(级联更新、级联删除)(转)