一、Shell基础
1、什么是shell?
shell是用户和Linux内核的解释器
2、常见的Shell解释器?
/bin/bash
/bin/sh
/bin/csh
/bin/tcsh
解释器负责将用户的指令翻译为内核可以识别的指令
通过usermod,chsh可以更改登录shell
3、修改用户的解释器
[root@localhost ~]# useradd test
[root@localhost ~]# grep test /etc/passwd
[root@localhost ~]# cat /etc/shells
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
[root@localhost ~]# yum -y install csh tcsh //安装新的解释器
[root@localhost ~]# usermod -s /bin/tcsh test //修改test用户的解释器
[root@localhost ~]# grep test /etc/passwd //解释器已经修改
4、什么选择/bin/bash为我们默认的解释器?
支持快捷键,tab补齐
支持历史命令(history)
支持命令别名(alias)
支持标准输入和输出的重定向(> >> 2> 2>> &>)
支持管道( | )
[root@localhost ~]# ls >> a.txt
[root@localhost ~]# cat a.txt //先创建a.txt文件,再去>重定向
[root@localhost ~]# ls xxxx > b.txt // >无法收集错误的信息,只能收集正确的
ls: cannot access xxxx: No such file or directory
[root@localhost ~]# ls xxxx 2> b.txt // 2> 可以收集错误的
[root@localhost ~]# ls xxx a.txt //如果输出结果既有正确的,又有错误的呢?
ls: cannot access xxx: No such file or directory
a.txt
[root@localhost ~]# ls xxx a.txt &> c.txt //&> 既可以收集错误的,也可以收集正确的
[root@localhost ~]# yum list | grep httpd //管道过滤
5、临时修改ksh解释器
[root@localhost ~]# yum -y install ksh
[root@localhost ~]# ksh //临时修改解释器
//exit返回bash解释器,ksh不支持ctrl+l,没有颜色(目录,快捷方式)
二、Shell脚本的设计与运行
1、什么是Shell脚本?
提前将可执行的命令语句写入一个文件
顺序执行
解释器逐行解释代码
//常见的脚本语言:Shell、PHP、JSP、Python、Perl、ruby脚本…
2、创建第一个Shell脚本
新建文件
添加可执行语句(命令)
给文件添加x执行权限
[root@localhost ~]# mkdir -p ~/shell/day01 //创建一个day01的目录
[root@localhost ~]# vim shell/day01/first.sh //编辑第一个脚本
echo "hello world"
[root@localhost ~]# chmod +x shell/day01/first.sh //赋予可执行权限
[root@localhost ~]# /root/shell/day01/first.sh //绝对路径执行(第一种方法)
hello world
[root@localhost ~]# cd /root/shell/day01/
[root@localhost day01]# ./first.sh //相对路径执行(第二种方法)
hello world
3、规范脚本的构成
#! 脚本声明(使用哪个解释器解释代码)
注释信息(步骤、思路、用途等),以#开始的为注释信息
可执行的语句
[root@localhost ~]# vim shell/day01/first.sh
#!/bin/bash
#This is my first shell
echo "hello world"
4、执行Shell脚本
方法一:需要为文件赋予可执行的权限
相对路径执行
绝对路径执行
方法二:不需要文件有可执行的权限
sh 脚本文件名 //不是去执行脚本,而是在执行脚本之前sh解释器就翻译了里面的内容
解释器本身就具备可执行权限,当它去读取一个没有可执行权限的文本的时候,但这个文本里面都是命令,它就可以自动的去执行
source 脚本文件名 //不会启动子进程,通过pstree查看进程树
[root@localhost ~]# cd shell/day01/ //进入day01目录
[root@localhost day01]# chmod -x first.sh //把可执行权限去掉
[root@localhost day01]# ls -ld first.sh //检查权限
-rw-r--r--. 1 root root 58 Sep 11 11:15 first.sh
[root@localhost day01]# sh first.sh //用sh解释器去执行,不需要x权限
hello world
sh执行
[root@localhost day01]# sh tmp.sh //用sh去执行
bash执行
[root@localhost day01]# bash tmp.sh //用bash去执行
source执行
[root@localhost day01]# source tmp.sh //用source去执行
//sh和bash都会开启一个子进程,但是source不会开子进程,直接exit退出终端
三、变量
1、定义变量
什么是变量?
以固定的名称,存放可以能变化的值
定义变量的格式?
变量名=变量值
取消变量的格式?
unset 变量名
注意事项
=两边不能有空格,不要使用关键字做变量名,如cd,ls等
如果变量名已经存在则覆盖之前的变量值
变量名称有:数字/字母/下划线组成,不能以数字开始
2、调用变量
[root@localhost ~]# a=11 //定义变量
[root@localhost ~]# echo $a //调用变量
11
[root@localhost ~]# a=33 //覆盖原来的值
[root@localhost ~]# echo $a //调用变量
33
3、设置变量的注意事项
[root@localhost ~]# a = 11 // =两边不能有空格
-bash: a: command not found
[root@localhost ~]# a)=22 // 不能有特殊符号
-bash: syntax error near unexpected XXXX `)'
[root@localhost ~]# 3a=33 //不能以数字开头
-bash: 3a=33: command not found
[root@localhost ~]# a_0=11 //由数字字母下划线组成
4、调用变量的注意事项
[root@localhost ~]# x=centos //定义变量
[root@localhost ~]# echo $x //调用变量
centos
[root@localhost ~]# echo ${x} //调用变量
centos
[root@localhost ~]# echo $x6.5 //因为变量名不可能是特殊符号.
.5
[root@localhost ~]# echo {$x}6.5 //{x}这样调用
{centos}6.5
[root@localhost ~]# unset x //取消变量,脚本中定义的变量只在脚本允许的时候有效
[root@localhost ~]# echo $x
5、变量类型
环境变量(变量名通常大写,有操作系统维护)
位置变量(bash内 置变量,存储脚本执行时的参数)
预定义变量(bash内
内置变量,可以调用但是不能赋值或修改)
自定义变量(用户自主设置)
环境变量
存储在/etc/profile或~/.bash_profile
命令env可以列出所有的环境变量
常见环境变量:PATH PWD USER UID HOME SHELL HOSTNAME
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
//查看系统的命令路径,系统会在这$PATH变量中定义的目录下去找有没有这个命令
[root@localhost ~]# ls //一个一个找有没有ls
[root@localhost ~]# PATH= //把PATH的值设置为空
[root@localhost ~]# ls //命令使用不了
-bash: ls: No such file or directory
[root@localhost ~]# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $PWD //列出当前位置
/root
[root@localhost ~]# echo $USER //列出登录当前系统的用户
root
[root@localhost ~]# echo $HOME //列出当前系统的家目录
/root
[root@localhost ~]# echo $SHELL //列出当前的解释器程序
/bin/bash
[root@localhost ~]# echo $PS1 //显示当前[root@localhost ~]格式
[\u@\h \W]\$
[root@localhost ~]# echo $PS2 //显示\什么时候执行,换行
>
[root@localhost ~]# which ls
/usr/bin/ls
[root@localhost ~]# env //查看所有的环境变量
[root@localhost ~]# set | grep abc //过滤设置的变量
位置变量
存储脚本执行时的参数
使用$n表示,n为数字序列号
$1 $2 … ${10} ${11} …
[root@localhost day01]# vim vars.sh //编辑位置变量脚本
#!/bin/bash
echo $1
echo $2
echo $3
[root@localhost day01]# chmod +x vars.sh //赋予x权限
[root@localhost day01]# ./vars.sh aa bb cc //aa是$1 bb是$2 cc是$3
aa
bb
cc
[root@localhost day01]# vim user.sh //创建用户,设置密码
#!/bin/bash
useradd $1
echo $2 | passwd --stdin $1
[root@localhost day01]# chmod +x user.sh //赋予x权限
[root@localhost day01]# ./user.sh tom 123 //tom是$1 123是$2
[root@localhost day01]# grep tom /etc/passwd//tom用户确实创建成功啦
tom:x:1002:1002::/home/tom:/bin/bash
预定义变量
用来保存脚本程序的执行信息
直接使用这些变量
不能直接为这些变量赋值
$0 当前所在的进程或脚本名
$$ 当前运行进程的PID号
$? 命令执行后的返回状态,0表示正常,1或其他值表示异常
$# 已加载的位置变量的个数
$* 所有位置变量的值
[root@localhost day01]# ls /etc/hosts //执行结果是成功
/etc/hosts
[root@localhost day01]# echo $?
0
[root@localhost day01]# ls /xxxxx //执行结果是失败
ls: cannot access /xxxxx: No such file or directory
[root@localhost day01]# echo $?
2
[root@localhost day01]# vim pre.sh
[root@localhost day01]# chmod +x pre.sh
#!/bin/bash
echo $0
echo $$
echo $#
echo $*
[root@localhost day01]# ./pre.sh aa 88 cc 33
./pre.sh //脚本名字
34372 //脚本PID
4 //位置变量个数
aa 88 cc 33 //位置变量的值
四、变量的扩展应用
1、各种引号的区别
双引号:“” 允许扩展,以$引用其他变量
单引号:‘’ 禁止扩展,即便$也视为普通字符
反引号:`` 将命令的执行输出作为变量值,$()与反引号等效
双引号&单引号
[root@localhost ~]# touch a b c //创建3个文件
[root@localhost ~]# touch "a b c" //创建1个文件
[root@localhost ~]# a=11
[root@localhost ~]# echo "$a"
[root@localhost ~]# echo '$a'
[root@localhost ~]# echo "$USER id is $UID"
[root@localhost ~]# echo '$USER id is $UID'
[root@localhost ~]# grep root /etc/passwd
反引号
[root@localhost ~]# test=`grep root /etc/passwd`
[root@localhost ~]# echo $test
[root@localhost ~]# test2=$(grep root /etc/passwd)
[root@localhost ~]# echo $test2
2、read命令定义变量
从键盘读入变量值完成赋值
格式:read [ -p “提示信息”] 变量名
-p可选
-t可指定超时秒速
-s设置是否在终端显示输入内容
[root@localhost ~]# read iname //给iname赋值
[root@localhost ~]# echo $iname
[root@localhost ~]# read -p "请输入用户名:" iname //-p 选项,有提示信息
请输入用户名:dachui
[root@localhost day01]# vim read.sh
#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:" -s pass //-s 密码不显示出来
useradd $name
echo $pass | passwd --stdin $name
[root@localhost day01]# chmood +x read.sh
[root@localhost day01]# read -t 3 name
3、全局 or 局部
局部变量
新定义的变量默认只能在当前shell环境中有效,无法在子Shell环境中使用
全局变量
全局变量在当前的Shell及子Shell环境中均有效
[root@localhost ~]# x=11
[root@localhost ~]# bash
[root@localhost ~]# echo $x
[root@localhost ~]# export y=22 //全局设置
[root@localhost ~]# bash
[root@localhost ~]# echo $y
22
五、Shell中的运算
整数运算
变量自增/减操作
小数运算
数字的比较
1、整数运算
加法 num1 + num2
减法 num1 - num2
乘法 num1 * num2
除法 num1 / num2
取余 num1 % num2
使用$[] 或者
(
(
)
)
表达式格式:
(())表达式 格式:
(())表达式格式:[整数1 运算符 整数2…]
计算结果替换表格式本身,可结合echo命令输出
2、变量的自增/减等操作
//let也可以运算,但是不会直接显示出来,需要echo调用
3、小数运算
root@localhost ~]# echo $[1.1+2.2] //报错,不能算小数
-bash: 1.1+2.2: syntax error: invalid arithmetic operator (error token is ".1+2.2")
[root@localhost ~]# yum -y install bc
//使用bc可以运算小数,scale指定小数位,quit退出
//bc命令行用法,;代表多个
但是scale只对除法、取余、乘幂有效,比如乘法就无效可以除以1
[root@mysql ~]# echo "scale=2;(1.111+2.222)/1" | bc
3.33
4、数字的比较
bc支持的比较操作符:> >= < <= == !=
表达式成立则返回1,否则返回0
六、综合案例
echo回显
监控硬件信息
数据计算
自动配置Yum源
1、echo回显
1)-n 不换行
2)-e 扩展属性 30多是字体颜色,40多是底色
// [0m代表结束,如果没写,整个字体颜色都会改变
#!/bin/bash
for ((i=30;i<38;i++))
do
echo -e "\033["$i"mI Love You\033[0m"
sleep 0.5
done
for ((i=40;i<48;i++))
do
echo -e "\033["$i"mI Love You\033[0m"
sleep 0.5
done
2、监控硬件信息
[root@localhost day01]# vim info.sh
#!/bin/bash
echo -e "\033[32m网卡\033[0m"
ifconfig ens33 | grep "inet "
echo -e "\033[33m内存\033[0m"
grep MemAvailable /proc/meminfo
echo -e "\033[34m磁盘\033[0m"
df -h /
echo -e "\033[35mCPU\033[0m"
grep "model name" /proc/cpuinfo
[root@localhost day01]# chmod +x info.sh
3、数据计算(1+2+3…的和)
[root@localhost day01]# vim calc.sh
#!/bin/bash
read -p "请输入一个正整数:" num
sum=$[num*(num+1)/2]
echo -e "\033[32m$num内整数的和是$sum\033[0m"
[root@localhost day01]# chmod +x calc.sh
[root@localhost day01]# ./calc.sh
请输入一个正整数:100
100内整数的和是5050
4、梯形面积、圆形面积
//r^代表多个次幂
#!/bin/bash
#梯形面积:(上底边长+下底边长)*高/2
read -p "上底:" a
read -p "下底:" b
read -p "高:" h
A=$(echo "($a+$b)*$h/2" |bc)
echo -e "\033[32m梯形面积是:$A\033[0m"
#圆形面积:πr2,π=3.14
read -p "半径:" r
A=$(echo "3.14*$r^2" |bc)
echo -e "\033[32m圆的面积是:$A\033[0m"
5、配置Yum源脚本
[root@localhost day01]# vim yum.sh
#!/bin/bash
url=file:///mnt
echo "[centos]
name=centos
baseurl=$url
gpgcheck=0" > /etc/yum.repos.d/el7.repo
[root@localhost day01]# chmod +x yum.sh
[root@localhost day01]# ./yum.sh
加油ヾ(◍°∇°◍)ノ゙,人一旦懒惰太久,上天就会收走你本有的天赋,每天坚持学习,让自己充实起来