shell
一、shell概述
1.1 什么是shell
shell:命令解释器(bash、zsh、cmd、xshell等)

1.2 shell种类
bsh:起源于贝尔实验室的shell
csh:起源于加利福尼亚大学,使用C语言语法风格,命令行交互方便
ksh:起源于贝尔实验室,结合了bsh和csh的优点
bash:bsh的升级版,吸取了ksh的特点,目前最广泛的,但不是最好的
zsh:兼具了各种shell的优点,可以自行安装yum install zsh -y
一般在/bin或者/usr/bin的目录下
1.2 如何查看当前shell环境
- 查看当前系统支持的shell环境
cat /etc/shells
- 查看当前正在使用的shell环境
echo $SHELL
二、bash基本功能
2.1 管道符
作用:将前面命令的输出结果,作为后面命令的输入
2.2 历史记录
history #默认记录1000条
!历史数组 #执行指定数字的历史记录命令
!命令字 #执行历史上最近一次的指定命令
history -c #删除历史记录
2.3 重定向符号
输出重定向
> 将命令的标准输出重定向到指定文件中,覆盖原有内容
>>将命令的标准输出追加到指定文件中
-----------------------------------------------
> 相当于 1> #正确的结果
2> #错误的结果
&> #正确和错误结果
配合/dev/null使用
输入重定向
< #将指定文件的内容作为命令的标准输入
脚本怕交互卡壳
passwd --stdin 用户名 < /路径/pass.txt
echo "密码" | passwd --stdin 用户名
#两个语句效果等同
2.4 awk
作用:过滤行和列
命令 | awk '/关键词/' #以关键字过滤行
命令 | awk '{print $n}' #以空格为分隔符,选中第n个内容(过滤列)
命令 | awk '/关键字/{print $n}' #组合使用
awk -F: '{print $n,$m}' #以:为分隔符,选中第n个和低m个内容
2.5 逻辑符
a && b:a执行成功后,才会执行ba || b:a执行失败后,才会执行ba ; b:连接两条命令,无论a执行成功与否,都会执行b
三、shell脚本(bash为例)
什么是脚本:批量的执行命令
作用:简化重复的工作
3.1 基本步骤
-
创建脚本
touch test.sh -
赋予执行权限
chmod a+x test.sh -
编辑脚本
vim test.sh -
执行脚本
./test.sh
3.2 执行脚本的方法
./脚本名子shell环境中执行--环境变量目录或当前目录中的脚本绝对路径/脚本名子shell环境中执行--绝对路径下的脚本. /路径/脚本名当前shell环境下执行--结合前两种路径下的脚本 (空格+.)
3.3 变量
变量类型
- 自定义变量
- 环境变量
- 位置变量
- 预定义变量
3.3.1 自定义变量
赋值
varName=Value #等号两边不能有空格
export varName=Value #定义全局变量
变量名设置规则
- 数字、字母、下划线组成,不能使用特殊符号
- 区分大小写
- 不能以数字开头
- 等号两边不能有空格
调用变量
$变量名其他字符串$变量名${变量名}其他字符串添加{}区别变量名和其他字符串
互动赋值
read varName
read -p "输入提示" varName
变量存储命令执行结果
varName=`命令`
先执行命令,后将命令执行结果赋值给varName
变量引用
在bash中,有些字符具有特殊含义,如果需要忽略这些字符的特殊含义,就必须使用引用技术。
- 使用转义字符
\ - 强引用:使用单引号
‘’,单引号中的字符都作为普通字符使用,不能套用 - 弱引用:使用双引号
“”,双引号中的部分字符仍保留特殊含义$-变量扩展- `-命令替换
\-禁止单个字符扩展
删除变量
unset varName
列出所有变量
set
set | grep varName
变量升级:全局变量
所有父子shell环境都可以使用的变量
export varName
export vaeName=Value
3.3.2 环境变量
自定义变量的一种,但是经常被调用,且与系统环境、背景有关系
| 变量名 | 含义 |
|---|---|
| HOME | 用户主目录 |
| LOGNAME | 登录名 |
| USER | 用户名,与登录名相同 |
| PWD | 当前目录/工作目录名 |
| 用户的邮箱绝对路径 | |
| HOSTNAME | 主机名 |
| INPUTRC | 默认的键盘映像 |
| SHELL | 用户使用的shell路径名 |
| LANG | 默认语言 |
| HISTSIZE | history命令最大条数 |
| PATH | 环境目录列表 |
| PS1、PS2 | shell一级、二级命令提示符 |
3.3.3 位置变量
./执行脚本 varName1 varName2 ...
eg:
touch test.sh
chmod a+x test.sh
vim test.sh
#!/bin/bash
echo 当前执行的脚本名$0
echo 第一个位置变量$1
echo 第二个位置变量$2

3.3.4 预定义变量
bash预定义好的一类特殊变量
$? #返回上一条命令的结果状态。0为成功;非0为失败
$* #返回所有位置变量的值
$# #返回所有位置变量的个数
$0 #脚本本身,也是位置变量
3.4 判断语句
3.4.1 if语句
-
单分支
if 判断条件 then 条件成立执行语句 fi -
双分支
if 判断条件 then 条件成立执行语句 else 条件不成立时执行语句 fi -
多分支
if 判断条件1 then 条件1成立执行语句 elif 判断条件2 then 条件2成立执行语句 else 条件1、2都不成立时执行的语句 fi
判断条件
-
数值比较
[ number1 -eq number2 ] -eq #等于 -ne #不等于 -gt #大于 -ge #大于等于 -lt #小于 -le #小于等于 -
字符串比较
[ "String1" = "String2" ] = #等于 != #不等于 -z #是否为空 eg: [ $LANG = "en.US.UTF-8" ] a="" [ -z $a ] echo $?配合使用:
[ $USER = "root"] && echo "the user is 超级用户" || echo "the user is 普通用户" -
文件或目录判断
! #取反 -d #是否为目录 -f #是否为文件 -e #是否存在 -r #当前用户是否有读权限 -w #当前用户是否有写权限 -x #当前用户是否有执行权限 eg: [ -d /root ] #判断/root是否为文件夹 echo $?
3.4.2 case语句
case 变量 in
情况1)
语句
;;
情况2)
语句
;;
情况3)
语句
;;
*)
语句
;;
esac
3.5 循环语句
3.5.1 For循环
for varName in varName取值范围
do
循环语句
done
-
for i in {1..100}#!/bin/bash for i in {30..39} do echo -e "\033[${i}mok\033[0m" done
-
for file in *.zip#!/bin/bash for file in *.zip do unzip "$file" done#!/bin/bash for file in *.tar.gz do tar -xf "$file" done -
for user in $*#!/bin/bash for user in $* do /usr/sbin/useradd $user &>/dev/null echo "password" | passwd --stdin $user &>/dev/null done echo "The users $* is added successfully! total is $#"
3.5.2 while循环
while 判断条件
do
成立时执行语句
done
自增
let i++
let i+=1
let i--
let i-=1
let i*=1
3.6 颜色
echo -e "\033[背景颜色数字;字体颜色数字m变色内容\033[0m"

字体背景颜色范围40-49
40:黑色
41:红色
42:绿色
43:黄色
44:蓝色
45:紫色
46:青色
47:白色
字体颜色范围30-39
30:黑色
31:红色
32:绿色
33:黄色
34:蓝色
35:洋红色
36:青色
37:白色
3.7 其他
echo不换行显示
echo -n "不换行"
ping
ping -c2 -i0.2 ip
#间隔为0.2秒 pingIP地址两次
多进程
- 将重复调用的代码写成函数
- 调用函数时加
&,表示
四、源码安装软件脚本案例
4.1 源码安装
源码安装步骤:
-
解压:.tar.gz文件
tar -xf **.tar.gz -
预编译
./cinfigure 指定安装路径,建议指定启动用户
-
编译
make
-
编译安装
make、install
目标:通过脚本完成,⼀键安装源码包nginx,整个安装过程不显示在屏幕上,通过⽕狐浏览器直接看本机启动后的httpd服务的欢迎页面
前提:源码包已解压缩,且在文件夹内启动脚本
#!/bin/bash
#创建程序用户 -u1000以内表示程序用户 -M不需要家目录 -s指定shell
useradd -u 250 -M -s /sbin/nologin nginx &>/dev/null
echo "Nginx程序⽤户nginx已经成功创建"
#使用config脚本⽣成makefile⽂件
echo "正在预编译-指定安装路径"
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx &> /dev/null
#编译和安装
echo "正在进⾏编译和安装"
make &>/dev/null && make install &>/dev/null
#启动nginx服务
/usr/local/nginx/sbin/nginx &>/dev/null
echo "Nginx服务启动完毕"
#启动⽕狐浏览器验证
echo "正在为您打开浏览器测试⽹⻚"
firefox http://127.0.0.1 &>/dev/null &
4.2 联动systemctl脚本
usr/lib/systemd/system/:存储所有服务脚本的路径,可以被systemctl程序识别的服务
#!/bin/bash
#服务名称
name=nginx
#安装路径
rout=/usr/local/nginx/sbin/nginx
#服务reload命令参数
rel="-s reload"
#服务stop命令参数
st="-s stop"
echo "[Unit]
Description=The ${name}
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
Environment=LANG=C
ExecStart=${rout}
ExecReload=${rout} ${rel}
ExecStop=${rout} ${st}
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target" >/usr/lib/systemd/system/${name}.service
#systemctl重新加载配置文件
systemctl daemon-reload

浙公网安备 33010602011771号