1.Shell编程概述
内核基础上的一个应用程序,开机自启,呈现给用户,用户通过Shell使用Linux。
俗称壳,区别于核。
拥有自己的基本编程元素,因而可以在Shell中编程。
Shell 也是一种编程语言,它的编译器(解释器)是 Shell 这个程序。我们平时所说的 Shell,有时候是指连接用户和内核的这个程序,有时候也指 Shell 编程。
2.Shell名词解释
2.1Shell
一个用C语言编写的程序;一个命令行解释器;
用户可以在 Shell 中输入命令,然后,它解释命令来执行所需的任务。
此外,它还可以执行程序和 Shell 脚本。Shell脚本是一组命令,用户应该遵循标准语法向 Shell 写入命令。
总的来说,Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Shell 既是一种命令语言,又是一种程序设计语言,如果要与内核打交道就必须学习 Shell 语言。
2.1.1分类
Shell 是提供与内核沟通接口的命令解释器程序,但实际上 Shell 是这种解释器的统称,Linux 系统的 Shell 种类很多,包括 Bourne Shell(简称 sh)、Bourne Again Shell(简称 bash)、C Shell(简称 csh)、K shell(简称 ksh)、Shell forRoot 等等。
#查看操作系统支持Shell类型
cat /etc/shells
#bash 在操作系统中具体的位置
which bash sh
2.1.2.She Bang
She Bang 是 Shell 脚本开头字符 #!
也可以叫 Sha Bang,当 Shell 文件被 Linux 系统读取时,内核会通过 #! 表示的值( 0x23, 0x21 )识别出随后的解释器路径并调用,最后再将整个脚本内容传递给解释器。由于 Shell 当中 # 字符同时表示注释,因此 Shell 解释脚本文件时会自动忽略该行。
总结: #! 就是告诉系统解释此脚本文件的 Shell 程序在哪(其后路径所指定的程序)。例如:
#! /bin/bash
echo "helloworld!"
She Bang 的格式很重要,格式不正确会导致命令工作不正常。因此,在创建脚本时,要始终记住 She Bang 格式的这两点:
它应该始终在脚本的第一行。
在 #! 和解释器的路径之间, # 之前不应有任何空格。
3.第一个Shell脚本
创建一个demo.sh 文件 并输入
4.脚本执行
给demo.sh文件加上执行权限,则可以 ./demo.sh 执行
sh bash 执行权限 会创建一个新的Shell进程执行Shell脚本
. source 不会创建新的Shell进程 ,在当前Shell进程中执行Shell脚本
5.Shell基础
5.1.注释
# 单行注释
<< EOF 多行注释 EOF EOF为开始结束标记
:‘ 多行注释 ’
5.2.变量
5.2.1.语法
定义变量时不加$,引用变量时需要加上$
变量声明需要遵循一定规则
声明变量语法格式如下:
variable=value
variable='value'
variable="value"
#变量的声明与赋值
name="zhangsan"
#变量的调用
echo $zhangsan
echo ${zhangsan}
#修改变量的值,已定义的变量可以重新赋值
name="lisi"
#只读变量
url="baidu.com"
readonly url
# 测试只读变量是否可以被修改
url="https://www.google.com"
# 删除变量
unset name
# 将命令结果复制给变量
info=`ls /usr/`
info=$(ls /usr/)
5.3.引号
5.4.位置参数
5.5.特殊变量
5.6.字符串
内容较多
5.7.数组
6.Shell 高级
内容较多,pdf移查。
7.Shell实战
虚拟机初始化脚本 init.sh 完整内容如下:
#!/bin/bash
## -bash: ./init.sh: /bin/bash^M: bad interpreter: No such file or directory
## vim 或者 vi 的命令模式下,输入命令 set fileformat=unix 即可解决上述问题
echo -e "\e[1;44m【在 /opt 目录和 /var 目录下创建 yjx 目录,在 /usr/local 目录下创建 scripts 目录】\e[0m"
sleep 2
mkdir -p /opt/yjx /var/yjx /usr/local/scripts
echo -e "\e[1;44m【关闭并禁用 firewalld 防火墙】\e[0m"
sleep 2
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
echo -e "\e[1;44m【关闭 SELinux】\e[0m"
sleep 2
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
#echo -e "\e[1;44m【安装 wget】\e[0m"
#sleep 2
# yum -y install wget
echo -e "\e[1;44m【修改 yum 源为阿里源】\e[0m"
sleep 2
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
mv /root/Centos-7.repo /etc/yum.repos.d/CentOS-Base.repo
#yum clean all
#yum makecache
echo -e "\e[1;44m【安装常用依赖】\e[0m"
sleep 2
yum -y install man man-pages telnet perl net-tools openssl-devel ntp lrzsz zip unzip tree vim rsync wget
echo -e "\e[1;44m【修改时区为 Asia/Shanghai】\e[0m"
sleep 2
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo -e "\e[1;44m【与中国 NTP 时间服务器 cn.ntp.org.cn 进行时间同步】\e[0m"
sleep 2
yum info ntp && yum -y install ntp && ntpdate cn.ntp.org.cn
echo -e "\e[1;44m【修改 hosts 文件,添加集群环境机器 IP 与域名映射】\e[0m"
sleep 2
echo "192.168.88.100 basenode" >> /etc/hosts
echo "192.168.88.101 node01" >> /etc/hosts
echo "192.168.88.102 node02" >> /etc/hosts
echo "192.168.88.103 node03" >> /etc/hosts
echo -e "\e[1;44m【安装 JDK 并设置环境变量】\e[0m"
sleep 2
rpm -ivh jdk-8u351-linux-x64.rpm
echo 'export JAVA_HOME=/usr/java/jdk1.8.0_351-amd64' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
echo -e "\e[1;44m【安装 Tomcat】\e[0m"
sleep 2
tar -zxf apache-tomcat-9.0.72.tar.gz -C /opt/yjx/
echo -e "\e[1;44m【安装 MySQL】\e[0m"
sleep 2
rpm -e --nodeps $(rpm -qa | grep mariadb)
tar -xvf mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-8.0.18-1.el7.x86_64.rpm
systemctl start mysqld
systemctl enable mysqld
temppasswd=$(grep "A temporary password" /var/log/mysqld.log | awk '{print $NF}')
mysql -uroot -p$temppasswd --connect-expired-password << EOF
SET GLOBAL validate_password.policy = low;
SET GLOBAL validate_password.length = 6;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
USE mysql;
UPDATE user SET host = '%' WHERE user = 'root';
COMMIT;
FLUSH PRIVILEGES;
EXIT
EOF
systemctl restart mysqld
echo -e "\e[1;44m【添加时间同步服务至开机启动】\e[0m"
sleep 2
echo '#!/bin/bash' >> /usr/local/scripts/auto_ntpdate.sh
echo 'yum info ntp && yum -y install ntp && ntpdate cn.ntp.org.cn' >> /usr/local/scripts/auto_ntpdate.sh
chmod +x /usr/local/scripts/auto_ntpdate.sh
echo '/usr/local/scripts/auto_ntpdate.sh' >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
echo -e "\e[1;44m【删除 JDK Tomcat MySQL 安装包和虚拟机初始化脚本】\e[0m"
sleep 2
rm jdk* -rf
rm apache-tomcat* -rf
rm mysql* -rf
rm init.sh -rf
echo -e "\e[1;41m【即将关闭计算机】\e[0m"
sleep 2
#shutdown -h now