2019-04-09 Day-28 Shell编程基础

Day28

作者:方维超

归档:课堂笔记

时间:2019/4/9

老男孩教育教学核心思想6重:重目标、重思路、重方法、重实践、重习惯、重总结

学无止境,老男孩教育成就你人生的起点!

一、Shell编程基础

Shell编程3小时光速入门

因为Web集群架构会用到Shell编程基础,提前讲

跟老男孩学Linux运维:Shell编程实战

https://item.jd.com/12117874.html

1、为什么要学Shell编程

Linux系统中会大量使用Shell,工作中我们也需要自动化实现业务,

例如:自动备份、监控、自动安装服务

Shell编程是Linux运维人员必须要会的编程语言。最简单的编程语言。

编程也是运维人员必须具备的本领:

Shell、Python 是运维必备的

2、什么是Shell?

Shell就是一个命令解释器(翻译官),命令行的命令以及脚本都会通过Shell解释,传给操作系统,处理后再输出给用户

[root@CentOS-F~]# tail -l /etc/passwd

oldboy:x:1000:1000::/home/oldboy:/bin/bash #《===创建用户时系统指定的翻译官

3、Shell的分类

1)Bourne shell

     Bourne shell又包括Bourne shell (sh)、Korn shell (ksh)、Bourne Again Shell(bash)三种类型。

2)C shell 又包含csh、tcsh两种类型

C7支持的shell

[root@CentOS-F~]# cat /etc/shells

/bin/sh 是bash的软链接

/bin/bash

/usr/bin/sh

/usr/bin/bash

4、C7的默认shell

[root@CentOS-F~]# echo $SHELL

/bin/bash

5、什么是Shell脚本?

程序、命令放入到文件里执行,这个文件称之为Shell脚本文件。

工作中最多的是编程写脚本,存放在文件里。

6、Shell的变量:

a. 全局变量(环境变量)

在整个系统中生效、一般是大写,系统中默认存在一些这样的变量,满足系统和程序运行的需求。

系统自带的环境变量:

[root@CentOS-F~]# echo PS1 [\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\]\[\e[31;1m\]\w\[\e[0m\]]\

[root@CentOS-F~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

[root@CentOS-F~]# echo $HOME
/root

[root@CentOS-F~]# echo $SHELL
/bin/bash

自定义环境变量:

方法1

export OLDBOY=“I am oldboy.”

[root@CentOS-F~]# export OLDBOY="I am oldboy"

[root@CentOS-F~]# echo $OLDBOY

I am oldboy

方法2

OLDBOY=“I am oldboy.”

export OLDBOY

[root@CentOS-F~]# OLDBOY="I am oldboy"

[root@CentOS-F~]# export OLDBOY

[root@CentOS-F~]# echo $OLDBOY

I am oldboy

永久生效的方法:

/etc/profile==>/.bash_profile===>/.bashrc===>/etc/bashrc < 依次被覆盖

推荐以后把环境变量放入/etc/bashrc

[root@oldboyedu ~]# tail -1 /etc/bashrc

export OLDBOY="I am oldboy."

[root@oldboyedu ~]# . /etc/bashrc

[root@oldboyedu ~]# echo OLDBOY #<==输出一个变量内容就加变量名

I am oldboy.

安装java服务的时候就会配置环境变量

b.局部变量(普通变量)

是编写Shell脚本最常用的变量。

变量名=值

例如:a=1,

变量名:数字、字母、下划线,不能是数字开头

= 等号:赋值符,把什么东西给谁。赋值符号两边不能有空格。

值:东西,变量内容

引用内容的符号:单引号(所见即所得)、双引号()、反引号(解析命令)、不加引号(同双引号)

[root@CentOS-F~]# a=1

[root@CentOS-F~]# echo $a

1

[root@CentOS-F~]# x=1

[root@CentOS-F~]# y=$x+1

[root@CentOS-F~]# echo $y

1+1

[root@CentOS-F~]# let y=“$x+1” #<==== let 让括号里的内容进行计算

[root@CentOS-F~]# echo $y

2

[root@CentOS-F~]# a=1

[root@CentOS-F~]# echo $a

1

[root@CentOS-F~]# echo ${a}b

1b

7、表达式

[ 表达式 ] 中括号表达式,中括号里面两端必须要有空格,可以有多个,至少有一个。

字符串要加双引号

[root@CentOS-F~]# [ a=a ] &&echo 1||echo 0
1

[root@CentOS-F~]# [ a=b ] &&echo 1||echo 0
1

[root@CentOS-F~]# [ "a" = "b" ] &&echo 1||echo 0 #如果表达式成立,打印1,否则打印0
0

[root@CentOS-F~]# [ "a" = "b" ] &&echo 1 #如果表达式成立,打印1,不成立不打印

[root@CentOS-F~]# [ "a" = "b" ] ||echo 0 #杠精 如果表达式是假的,打印0
0

[root@CentOS-F~]# [ ! "a" = "b" ] &&echo 1 #取反
1

整数表达式:

(大于) -gt

= (大于等于) -ge

< (小于) -lt

<= (小于等于) -le

= (等于) -eq

 不等于       -ne

[root@CentOS-F~]# a=1

[root@CentOS-F~]# [ $a -eq 2 ] && echo 1||echo 2
2

[root@CentOS-F~]# [ $a -eq 1 ] && echo 1||echo 2
1

[root@CentOS-F~]# a=1

[root@CentOS-F~]# b=3

[root@CentOS-F~]# [ a -gtb ] && echo 1||echo 2
2

1)整数表达式符 两端必须要有空格

2)中括号里面两端必须要有空格

3)变量和比较的内容,不需要加引号

字符表达式

-z 变量内容长度为0时,为真(正确)。zero

-n 变量内容长度【不】为0时,为真(正确)。not zero

a==a 双等号 字符串是否相同

说明:

1)字符串要加双引号

例子:

[root@CentOS-F~]# oldboy="I am oldboy"

[root@CentOS-F~]# [ -z "$oldboy" ] && echo 1 || echo 0
0

[root@CentOS-F~]# oldboy=""

[root@CentOS-F~]# [ -z "$oldboy" ] && echo 1 || echo 0
1

[root@CentOS-F~]# [ -n "$oldboy" ] && echo 1 || echo 0
0

[root@CentOS-F~]# [ "你" == "我" ] && echo 1 || echo 0
0

8、判断句:

如果…那么。

如果[ 你是潜力股 ]

   那么

就和你谈朋友

否则

   拜拜

if判断句语法:

if [ 表达式 ]

then

命令

fi

如果[ 你是潜力股 ]

那么

就和你谈朋友

果如

[root@CentOS-F~]# vim test.sh

!/bin/bash

a=10

if [ $a -gt 1 ]

then

echo 1

fi

~

"test.sh" 6L, 52C written

[root@CentOS-F~]# bash test.sh

1

[root@CentOS-F~]# vim test.sh

!/bin/bash

a=3

if [ $a -gt 5 ]

then

echo 1

fi

echo 2

~

"test.sh" 7L, 61C written

[root@CentOS-F~]# bash test.sh

2

[root@CentOS-F~]# vim test.sh

!/bin/bash

boy="潜力股"

if [ "$boy" == "潜力股" ]

then

echo "先和你谈谈朋友"

else

echo "拜拜"

fi

~

"test.sh" 8L, 122C written

[root@CentOS-F~]# bash test.sh

先和你谈谈朋友

[root@CentOS-F~]# vim juide_date.sh

if [ $(date +%w) -eq 2 ]

then

echo "一起睡觉"

else

echo "一起游戏"

fi

~

"juide_date.sh" [New] 6L, 86C written

[root@CentOS-F~]# bash juide_date.sh

一起睡觉

实现多条件用 || 符号

[root@oldboyedu ~]# cat judge_date.sh

if [ (date +%w) -eq 6 ] || [(date +%w) -eq 0 ]

then

echo "一起去旅游吧"

else

echo "还是好好上课吧"

fi

read 命令,交互式读取用户输入

-p “提醒:”

-t “多长时间内等待输入”

[root@CentOS-F~]# read -t 3 -p "请输入一句话:"

请输入一句话:[root@CentOS-F~]#

[root@CentOS-F~]# read -p "请输入一句话:" boy

请输入一句话:潜力股

[root@CentOS-F~]# echo $boy

潜力股

[root@oldboyedu ~]# cat test.sh

!/bin/bash

read -p "请输入你喜欢的男孩的一句话:" boy
if [ "$boy" == "潜力股" ]
then
echo "先和你谈谈朋友"
else
echo "白白"
fi

[root@oldboyedu ~]# sh test.sh
请输入你喜欢的男孩的一句话:
我没钱
白白
[root@oldboyedu ~]# sh test.sh
请输入你喜欢的男孩的一句话:潜力股
先和你谈谈朋友

https://blog.51cto.com/oldboy/1864839

特殊位置变量:

$1 脚本文件的第一个参数

$2 脚本文件的第二个参数

[root@oldboyedu ~]# cat t.sh
echo 12
[root@oldboyedu ~]# sh t.sh oldboy oldgirl
oldboy oldgirl

9、for 循环

for n in 取值列表

do

执行命令

done

[root@oldboyedu ~]# cat for1.sh
for n in 1 2 3 4 5
do
echo $n
done
[root@oldboyedu ~]# sh for1.sh
1
2
3
4
5
[root@oldboyedu ~]# sh -x for1.sh -x#<====查看输出过程 + for n in 1 2 3 4 5

  • echo 1
    1
  • for n in 1 2 3 4 5
  • echo 2
    2
  • for n in 1 2 3 4 5
  • echo 3
    3
  • for n in 1 2 3 4 5
  • echo 4
    4
  • for n in 1 2 3 4 5
  • echo 5
    5

[root@CentOS-F~]# vim for.sh

for n in 10.0.0{1..254}

do

echo $n

done

[root@CentOS-F~]# vim for.sh

for n in {1..254}

do

echo “10.0.0.$n”

done

注意:
1.read -p "请输入两个整数" a b,这个怎么理解,为什么不是写a,b 因为read命令 -p 和 双引号里的属于提示,不用管. 而后面的a b是变量,相当于在外面写变量a=1,变量b=2(用1,2举例),而a,b是解析变量并取出里面的值来进行比较
2.a=1 b=2怎样理解,例如sh int.sh 1 2可以理解为,把1给了第一个变量,把2给了第二个变量,1解析出第一个变量给了a,2解析出第二个变量给了b

练习:

[root@CentOS-F~]# vim 1.sh

!/bin/sh

read -p "请输入两个整数:" a b

if [ a -gtb ]

then

echo "a >b"

elif [ a -eqb ]

then

echo "a =b"

elif [ a -ltb ]

then

echo "a <b"

else

echo " "

fi

~

练习:

[root@CentOS-F~]# vim juide_date.sh

!/bin/bash

read -p "请输入你喜欢的男孩子的一句话:" boy

if [ "$boy" == "潜力股" ]

then

echo "先和你谈谈朋友"

elif [ "$boy" == "帅" ]

then

▽ echo "你想干啥"

elif [ "$boy" == "丑" ]

then

echo "你好萌"

else

fi

练习题:Shell编程实现两个整数比较大小

[root@oldboyedu ~]# cat com_num.sh

!/bin/sh

read -p "请输入两个整数:" a b

if [ a -gtb ]

then

echo "a>b"

elif [ a -eqb ]

then

echo "a=b"

else

echo "a<b"

fi

[root@oldboyedu ~]# sh com_num.sh

请输入两个整数:2 3

2<3

[root@oldboyedu ~]# sh com_num.sh

请输入两个整数:3 3

3=3

[root@oldboyedu ~]# sh com_num.sh

请输入两个整数:3 4

3<4

[root@oldboyedu ~]# sh com_num.sh

请输入两个整数:3 2

3>2

书写脚本习惯:

  1. 以.sh结尾。

  2. 脚本开头第一行 #!/bin/bash 脚本内容有谁来解释。

由于Linux下默认时bash,所以可以不写这行。

课后练习:

1、比较整数大小。

[root@CentOS-F~]# vim 整数.sh

!/bin/bash

read -p "请输入两个整数:" a b

if [ a -gtb ]

then

echo "a>b"

elif [ a -eqb ]

then

echo "a=b"

else

echo "a<b"

fi

~

"整数.sh" [New] 12L, 157C written

[root@CentOS-F~]# bash 整数.sh

请输入两个整数:2 3

2<3

[root@CentOS-F~]# bash 整数.sh

请输入两个整数:9 9

9=9

[root@CentOS-F~]# bash 整数.sh

请输入两个整数:4 1

4>1

2、判断日期,每周六日去旅游,其它时间上课。

[root@CentOS-F~]# vim 旅游.sh

!/bin/bash

if [ (date +%w) -eq 6 ]||[(date +%w) -eq 0 ]||[ $(date +%w) -eq 2 ]

then

echo "一起去旅游"

else

echo "一起去上课"

fi

~

"旅游.sh" 7L, 150C written

[root@CentOS-F~]# bash 旅游.sh

一起去旅游

3、取出当前系统Ip地址,判断是否为[图片上传失败...(image-8c2208-1554814171245)] 10.0.0.31,如果是提示正确,如果不是给出提示。**

[root@CentOS-F~]# vim IP.sh

!/bin/bash

read -p "请输入IP:" a

if [ "$a" == hostname -I ]

then

echo -e "\033[41;36;1m "正确" \033[0m"

elif [ "$a" == "10.0.0.31" ]

then

echo -e "\033[41;36;1m "错误" \033[0m"

fi

~

~

"IP.sh" 9L, 201C written

[root@CentOS-F~]# bash IP.sh

请输入IP:10.0.0.200

正确

[root@CentOS-F~]# bash IP.sh

请输入IP:10.0.0.31

错误

4、打印[图片上传失败...(image-40ffcf-1554814171245)] 10.0.0.1--[图片上传失败...(image-1187b3-1554814171245)] 10.0.0.254个Ip地址,当IP地址为系统IP地址时,给出某IP是系统IP的提示。**

[root@CentOS-F~]# vim 打印.sh

!/bin/bash

for n in {1..254}

do

a=10.0.0.$n

echo "$a"

if [ $a == hostname -I ]

then

echo "$a 本机IP"

fi

done

~

"打印.sh" 10L, 130C written

[root@CentOS-F~]# bash 打印.sh

10.0.0.1

10.0.0.2

…….

10.0.0.199

10.0.0.200

10.0.0.200 本机IP

10.0.0.201

10.0.0.202

……

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

推荐阅读更多精彩内容