Shell基本概述
1.shell入门
1)什么是shell 壳
命令解释器 用户输入命令 解释器负责解释给内核 处理后的结果 反馈用户 称为解释
交互式shell 用户输入命令 解释器解释把处理后的结果反馈给用户的过程称为 交互式
非交互shell shell执行文本中的命令 当执行到文件的末尾 bash退出
父shell 不能继承子shell变量 子shell可继承父shell变量
2)什么是shell脚本
把可执行命令堆积到一个文本中则称为shell脚本(条件表达式 for循环 if判断等等语句)
shell执行方式
hello world!
执行脚本的三种方式
1)bash test.sh
[root@web01 scripts]# bash test.sh
Hello World!
2)全路径执行
[root@web01 scripts]# chmod +x test.sh
[root@web01 scripts]# /server/scripts/test.sh
Hello World!
3). 或者source执行
[root@web01 scripts]# . test.sh
Hello World!
[root@web01 scripts]# source test.sh
Hello World!
什么区别?
1 2 在子shell中执行
. source 父进程下执行
环境变量
1.环境变量定义
什么是环境变量?
右边一堆内容,用一个名字来代替称为环境变量
name="I am lizhenya"
如何查看环境变量? 名称的前面加上name
如何查看系统定义好的环境变量
env set
如何取消环境变量?
unset name
环境变量(全局变量) 普通变量(局部变量)
按照生存周期划分
永久性 修改配置文件 /etc/profile
临时性 使用export 变量名称 声明即可
不加export 只对当前的shell生效
加export 对当前登录窗口所有的shell生效
2.环境变量的相关文件
1. /etc/profile 开机或者新连接的窗口执行一次
2. .bashrc
3. .bash_profile
4. /etc/bashrc
3.如何定义环境变量
变量名=变量值
环境变量名称的定义 字符 下划线 数字的组合 尽量以字母开头(禁止使用数字开头) 等号两端不允许有空格 见名知其意
4.书写方式
1. OLDBOY_AGE=18 系统中变量的定义格式
2. oldboy_age=18
3. oldboy_Age=18 小驼峰语法
4. Oldboy_Age=18 大驼峰语法
5.变量值的定义方式
1.数字定义
oldboy_age=18 连续的数字
2.字符串的定义
name="oldboy" 使用双引号 不知道加什么符号 就加双引号 解析变量
name='oldboy' 所见即所得 吃什么吐什么
3.命令的定义
time=`date` 反引号 里面必须跟可执行命令
time=$(date) $()
[root@web01 scripts]# name=oldboy
[root@web01 scripts]# echo "$oldboyisok"
[root@web01 scripts]# echo "${oldboy}isok"
isok
[root@web01 scripts]# echo "${name}isok"
oldboyisok
[root@web01 scripts]# echo '${name}isok'
${name}isok
重要的特殊位置变量
$0 脚本的名称,如果全路径执行脚本,则脚本名称也带全路径 basename 获取脚本的名称 重要
案例: 给用户提示如何使用此脚本
echo $"Usage: $0 {start|stop|status|restart|force-reload}"
$n 脚本的第n个参数 $0被脚本名称占用 从$1开始 $9以后 需要加{}
$# 代表了脚本的传参的总个数 重要
案例:
[ $# -ne 2 ] && echo "你请输入两个参数" && exit
$* 脚本的所有的传参的参数 如果不加双引号则和$@相同 加上双引号则把所有参数视为一个整体
$@ 脚本的所有的传参的参数 如果不加双引号则和$*相同加上双引号则把所有参数视为独立的参数
$* 和$@ 正常情况下一样 循环体内不同
$? 获取上一条命令的结果 0为成功 非0 失败 重要
$$ 获取脚本的PID
案例
服务器运行大量的名称相同的脚本
echo $$ > /tmp/count.pid
$! 上一个在后台运行脚本的PID 调试使用
$_ 获取脚本的最后一个参数 相当于ESC .
传参的三种方式
1)直接传参
2)赋值传参
3)read传参
1.第一种传参方式
sh a.sh $1
echo $1 $2
2.第二种传参方式
name=$1
age=$2
echo $name $age
read -p "请输入名字和年龄" name1 age1
echo $name1 $age1
3.使用read 传参的方式 更改系统的主机名称和IP地址的最后一位 192.168.12.X
案例:
#!/bin/sh
sdir="/etc/sysconfig/network-scripts/ifcfg-eth0"
sip=`cat /etc/sysconfig/network-scripts/ifcfg-eth0|awk -F. '/IPADDR/{print $NF}'|cut -c1`
read -p "请输入主机名称: " name
hostnamectl set-hostname $name
read -p "请输入IP地址的最后一位: " ip
sed -i "s#$sip#$ip#g" $sdir
案例:
sh ping.sh www.baidu.com
ping www.baidu.com is ok
sh ping.sh www.xxxxx.com is error
[root@web01 scripts]# cat ping.sh
#!/bin/sh
read -p "请输入一个网址: " url
ping -c 1 -W 1 $url >/dev/null 2>&1
[ $? -eq 0 ] && echo "ping $url is ok" || echo "ping $url is error"
变量的字符串知识
1.统计变量的长度
[root@web01 scripts]# name="I am lizhenya"
[root@web01 scripts]# echo $name
I am lizhenya
[root@web01 scripts]# echo "I am lizhenya"
I am lizhenya
[root@web01 scripts]# echo "I am lizhenya"|wc -L
13
[root@web01 scripts]# echo $name|wc -L
13
[root@web01 scripts]# echo ${#name}
13
2.变量的切片
[root@web01 scripts]# echo ${name:0:1}
I
[root@web01 scripts]# echo ${name:2:2}
am
[root@web01 scripts]# echo ${name:0:1}
I
[root@web01 scripts]# echo ${name:1}
am lizhenya
[root@web01 scripts]# echo ${name:2:5}
am li
3.取字符串长度
###I am lizhenya teacher I am 18
方法1
echo I am lizhenya teacher I am 18|wc -L
方法2
name="I am lizhenya teacher I am 18"
echo ${#name}
方法3
[root@web01 scripts]# expr length "$name"
29
方法4
[root@web01 scripts]# echo $name|awk '{print length}'
29
4.取字符串长度小于3的
方法1
for循环方式
[root@web01 scripts]# cat for.sh
#!/bin/sh
for i in I am lizhenya teacher I am 18
do
[ ${#i} -lt 3 ] && echo $i
done
方法2
[root@web01 scripts]# echo I am lizhenya teacher I am 18|xargs -n1|awk '{if(length<3)print}'
I
am
I
am
18
方法3
[root@web01 scripts]# echo I am lizhenya teacher I am 18|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
5.变量的删除和替换
从前往后删除变量内容
[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url#*.}
sina.com.cn
[root@web01 scripts]# echo ${url#*.*.}
com.cn
[root@web01 scripts]# echo ${url##*.}
cn
从后往前删除变量内容
[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url%.*}
www.sina.com
[root@web01 scripts]# echo ${url%%.*}
www
变量的替换
[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url/w/a}
aww.sina.com.cn
[root@web01 scripts]# echo ${url/w/aa}
aaww.sina.com.cn
[root@web01 scripts]# echo ${url/w/a}
aww.sina.com.cn
[root@web01 scripts]# echo ${url//w/a}
aaa.sina.com.cn
[root@web01 scripts]# echo ${url/sina/baidu}
www.baidu.com.cn