shell编程(一)

1.shell的入门
1)什么是shell 壳
命令解释器 用户输入命令 解释器负责解释给内核 处理后的结果 反馈用户 称为解释
交互式shell 用户输入命令 解释器解释把处理后的结果反馈给用户的过程称为 交互式
非交互shell shell执行文本中的命令 当执行到文件的末尾 bash退出
父shell 不能继承子shell变量 子shell可继承父shell变量
2)什么是shell脚本
把可执行命令堆积到一个文本中则称为shell脚本(条件表达式 for循环 if判断等等语句)

2.shell脚本的书写规范
1) 目录统一
2) shell脚本的结尾要以.sh结尾
3) 脚本的开头需要有解释器 /bin/bash /bin/sh
4) 脚本中需要有作者信息 #Author lzy date version 做什么的
5) 脚本每行 或者 一个语句 给一个注释
6) shell中的文字尽量使用英文 py都是中文
7) 成对的符号一次性书写完毕 语句
3.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! 

4.几种方式的区别?
前两种方式都是在子shell中执行
. source 是在父进程中执行

5.环境变量
1)什么是环境变量?
右边一堆内容,用一个名字来代替称为环境变量
环境的相关文件

  1. /etc/profile 开机或者新连接的窗口执行一次
  2. .bashrc
  3. .bash_profile
  4. /etc/bashrc
    2)如何定义环境变量
    变量名=变量值
    不加export,只对当前shell生效
    加export,对当前窗口下所有shell生效
[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

6.重要的特殊位置的变量

$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 .

7.传参的三种方式
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
这个脚本使用的时候是替换取出来的值,还是有可能会报错
#!/bin/bash
#author weixu
cd /etc/sysconfig/network-scripts/
hostnamectl set-hostname $1
[ $? -eq 0 ] && echo "success"|| echo "fail"
sed -ri "/^IPA/s#(.*\.).*#\1$2#g" ifcfg-eth[01]
[ $? -eq 0 ] && echo "success"|| echo "fail"
cd
案例:
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"

8.变量的字串知识

变量的切片
[root@web01 scripts]# echo ${name:0:1}
I
[root@web01 scripts]# echo ${name:1}
am lizhenya
取字符串长度
方法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
    
面试题:取字符串长度小于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}'

9.变量的删除和替换

从前往后删除变量内容
[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}
aaa.sina.com.cn
[root@web01 scripts]# echo ${url/sina/baidu}
www.baidu.com.cn
一个/是替换匹配到的第一个,两个//是替换所有

10.数值的运算

expr $(()) $[] 整数运算 第二种效率最高
[root@web01 scripts]# expr 1+1
1+1
[root@web01 scripts]# expr oldboy
oldboy
[root@web01 scripts]# echo $((10+10))
20
[root@web01 scripts]# echo $[10+10]
20
let  重点 
[root@web01 scripts]# let sum=10+10
[root@web01 scripts]# echo $sum
20
i++   变量自增
[root@web01 scripts]# let i=i+1
[root@web01 scripts]# echo $i
1
[root@web01 scripts]# let i++
[root@web01 scripts]# echo $i
2
bc awk python 可以计算小数.
[root@web01 scripts]# echo 10+10.5|bc
20.5
[root@web01 scripts]# awk 'BEGIN{print 10*10.5}'
105
[root@web01 scripts]# awk 'BEGIN{print 10^10}'
10000000000

案例
加减乘除的计算器

[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]"

11.条件表达式
[]======test []常用
[ -f file ] 文件是否存在 且为普通文件 重点
[ -e file ] 文件存在则为真
[ -d file ] 目录存在则为真 重点
[ -x file ] 文件有执行权限则为真
[ -w file ] 文件可写则为真
[ -r file ] 文件可读则为真
案例

[root@web01 scripts]# [ -f /etc/init.d/functions ] && . /etc/init.d/functions
[root@web01 scripts]# action "hehehe is"  /bin/true
hehehe is                                                  [  确定  ]
[root@web01 scripts]# action "hehehe is"  /bin/false
hehehe is                                                  [失败]
函数库使用
[root@web01 scripts]# cat ping.sh 
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
read -p "请输入一个网址: " url
ping -c 1 -W 1 $url >/dev/null 2>&1
[ $? -eq 0 ] && action "ping $url is" /bin/true || action "ping $url is" /bin/false

12.数值的比较
[ 数值1 比较符 数值2 ] [[]] = != >= < <=
-eq 相等
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
案例1
统计当前磁盘的使用率 如果大于5% 则把内容写入到以日期为名称的文本中 2019-08-01.txt
如果小了 则把当前的使用率 写入 2019-08-01.txt
1.如何取出当前的使用率
2.条件表达式 整数的比较
3.输出结果到文本
4.调试

[root@shell scripts]# cat usedisk.sh 
#!/bin/sh
time=`date +%F`
usedisk=`df -h|grep /$|awk '{print $(NF-1)}'`
[ ${usedisk%\%} -gt 5 ] && echo "当前使用率不正常 $usedisk" >> ${time}.txt || echo "当前使用率正常 $usedisk" >> ${time}.txt 

案例2
统计系统内存的使用率 如果大于10则 echo 使用率到 以时间命名的文件中
1.如何取出当前的使用率
百分比=====使用的除总数乘100
2.条件表达式 整数的比较
3.输出结果到文本
4.调试

[root@web01 scripts]# free|awk 'NR==2{print $3/$2*100}'
19.0124
[root@web01 scripts]# free=`free|awk 'NR==2{print $3/$2*100}'`
[root@web01 scripts]# [ ${free%.*} -gt 10 ] && echo error || echo ok
error
[root@web01 scripts]# [ ${free%.*} -gt 80 ] && echo error || echo ok
ok
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353