Shell介绍(一)变量、传参、数值运算
Shell编程
1.什么情况下使用Shell
1:安装CentOS系统 自动化安装操作系统(kickstart cobbler) 底层shell
2:网络IP地址
3:初始化操作系统(ntp时间同步,更改默认YUM源,SSH端口,SSH远程连接禁止DNS解析,禁止root登录,关闭seilnux,防火墙优化(c6 iptables c7 firewald) 80 443 22 8080 10050 ,安装常用的软件命令 lrzsz wget net-tools... 加大文件描述符 中文字符集 内核参数优化 别名 重要的文件加上i a....等)
2.学习shell脚本需要用到的知识
1:远程连接工具 Xshll CRT(作业)
2:lINUX的常用命令 熟练掌握
3:三剑客命令熟练
4:vim编辑器熟练
3.shell入门
1:什么是shell 壳
命令解释器 用户输入命令 解释器负责解释给内核 处理后的结果 反馈用户 称为解释
交互式shell 用户输入命令 解释器解释把处理后的结果反馈给用户的过程称为 交互式
非交互shell shell执行文本中的命令 当执行到文件的末尾 bash退出
父shell 不能继承子shell变量 子shell可继承父shell变量
2:什么是shell脚本
把可执行命令堆积到一个文本中则称为shell脚本(条件表达式 for循环 if判断等等语句)
4.shell脚本的书写规范
1: 目录统一
2: shell脚本的结尾要以.sh结尾
3: 脚本的开头需要有解释器 /bin/bash /bin/sh
4: 脚本中需要有作者信息 #Author lzy date version 做什么的
5: 脚本每行 或者 一个语句 给一个注释
6: shell中的文字尽量使用英文 py都是中文
7: 成对的符号一次性书写完毕 语句
5.第一个shell脚本
hello world!
执行脚本的三种方式
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 父进程下执行
7. 环境变量
1:什么是环境变量?
右边一堆内容,用一个名字来代替称为环境变量
name="I am qmf"
如何查看环境变量? 名称的前面加上$
echo $name
如何查看系统定义好的环境变量
env set
如何取消环境变量?
unset name
环境变量(全局变量) 普通变量(局部变量)
按照生存周期划分
永久性 修改配置文件 /etc/profile
临时性 使用export 变量名称 声明即可
不加export 只对当前的shell生效
加export 对当前登录窗口所有的shell生效
环境的相关文件
1. /etc/profile 开机或者新连接的窗口执行一次
2. .bashrc
3. .bash_profile
4. /etc/bashrc
2:如何定义环境变量
变量名=变量值
环境变量名称的定义 字符 下划线 数字的组合 尽量以字母开头(禁止使用数字开头) 等号两端不允许有空格 见名知其意
书写方式
1. qmf_AGE=18 系统中变量的定义格式
2. qmf_age=18
3. qmf_Age=18 小驼峰语法
4. qmf_Age=18 大驼峰语法
变量值的定义方式
数字的定义
qmf_age=18 连续的数字
字符串的定义
name="qmf" 使用双引号 不知道加什么符号 就加双引号 解析变量
name='qmf' 所见即所得 吃什么吐什么
命令的定义
time=`date` #反引号 里面必须跟可执行命令 time=$(date) $() [root@web01 scripts]# name=qmf [root@web01 scripts]# echo "$qmfisok" [root@web01 scripts]# echo "${qmf}isok" isok [root@web01 scripts]# echo "${name}isok" qmfisok [root@web01 scripts]# echo '${name}isok' ${name}isok
8. 重要的特殊位置变量
$0脚本的名称,如果全路径执行脚本,则脚本名称也带全路径 basename 获取脚本的名称 重要
案例: 给用户提示如何使用此脚本
echo $"Usage: $0 {start|stop|status|restart|force-reload}"
$n 脚本的第n个参数 $0被脚本名称占用 从$1开始 $9以后 需要加{}
$# 代表了脚本的传参的总个数 重要
案例:
[ $# -ne 2 ] && echo "你请输入两个参数" && exit
$* 脚本的所有的传参的参数 如果不加双引号则和$@相同 加上双引号则把所有参数视为一个整体
$@ 脚本的所有的传参的参数 如果不加双引号则和$*相同加上双引号则把所有参数视为独立的参数
$* 和$@ 正常情况下一样 循环体内不同
$? 获取上一条命令的结果 0为成功 非0 失败 重要
$$ 获取脚本的PID
$! 上一个在后台运行脚本的PID 调试使用
$_ 获取脚本的最后一个参数 相当于ESC .
9. 传参的三种方式
1:直接传参
2:赋值传参
3:read传参
#第一种传参方式 echo $1 $2 #第二种传参方式 name=$1 age=$2 echo $name $age read -p "请输入名字和年龄" name1 age1 echo $name1 $age1
案例:使用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
案例:ping 网址知否通
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"
10. 变量的字串知识
[root@web01 scripts]# echo "I am lizhenya"|wc -L 13 [root@web01 scripts]# echo $name|wc -L 13
变量的切片
[root@web01 scripts]# name="I am qmf" [root@web01 scripts]# echo ${name:0:1}#从开始查找第一个字符 I [root@web01 scripts]# echo ${name:2:2}#从第二个字符为开始查两个字符 am [root@web01 scripts]# echo ${name:1}#从一个字符未开始查以后所有字符 am qmf
面试题:取字符串长度小于3的
[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
[root@web01 scripts]# echo I am lizhenya teacher I am 18|xargs -n1|awk '{if(length<3)print}' I am I am 18
[root@web01 scripts]# echo I am lizhenya teacher I am 18|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
变量的删除和替换
从前往后删除变量内容
[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}#把第一个w替换成a aww.sina.com.cn [root@web01 scripts]# echo ${url//w/a}#把所有的w替换成a aaa.sina.com.cn [root@web01 scripts]# echo ${url/sina/baidu}#把sina替换成百度 www.baidu.com.cn
11:数值的运算
1. expr 整数运算
[root@web01 scripts]# expr 1 + 1#加+ 减- 乘\* 除/ 2
2. $(()) 整数运算 运算效率最高
[root@web01 scripts]# echo $((10+10))#加 20 [root@web01 scripts]# echo $((10-10))#减 0 [root@web01 scripts]# echo $((10*10))#乘 100 [root@web01 scripts]# echo $((10/10))#除 1
3. $[ ] 整数运算
[root@web01 scripts]# echo $[10+10] 20 [root@web01 scripts]# echo $[10-10] 0 [root@web01 scripts]# echo $[10*10] 100 [root@web01 scripts]# echo $[10/10] 1
4. let 重点
[root@web01 scripts]# let sum=10+10#直接传参 [root@web01 scripts]# echo $sum 20 [root@web01 scripts]# num1=100#设置变量 [root@web01 scripts]# num2=50 [root@web01 scripts]# let sum=$num1+$num2 [root@web01 scripts]# echo $sum 150 [root@web01 scripts]# let sum=$num1-$num2 [root@web01 scripts]# let sum=$num1*$num2 [root@web01 scripts]# let sum=$num1/$num2
5. bc
[root@web01 scripts]# echo 10+10|bc [root@web01 scripts]# echo 10-10|bc [root@web01 scripts]# echo 10*10|bc [root@web01 scripts]# echo 10/10|bc [root@web01 scripts]# echo 10+10.5|bc 20.5
6:awk
[root@web01 scripts]# awk 'BEGIN{print 10+10}' [root@web01 scripts]# awk 'BEGIN{print 10-10}' [root@web01 scripts]# awk 'BEGIN{print 10/10.5}' [root@web01 scripts]# awk 'BEGIN{print 10*10.5}' [root@web01 scripts]# awk 'BEGIN{print 10^10}' #平方运算 [root@web01 scripts]# echo 100 200 #变量运算 100 200 [root@web01 scripts]# echo 100 200|awk '{print $1+$2}' 300
案例:计算器
[root@web01 scripts]# cat count.sh #!/bin/sh read -p "请输入第一个数字: " num1 read -p "请输入第二个数字: " num2 echo "$num1+$num2=$[$num1+$num2]" echo "$num1-$num2=$[$num1-$num2]" echo "$num1*$num2=$[$num1*$num2]" echo "$num1/$num2=$[$num1/$num2]"