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

[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 变量名

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~]# [ b ] && 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 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 2
[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,这个怎么理解,为什么不是写b 因为read命令 -p 和 双引号里的属于提示,不用管. 而后面的a b是变量,相当于在外面写变量a=1,变量b=2(用1,2举例),而b是解析变量并取出里面的值来进行比较
2.a=2怎样理解,例如sh int.sh 1 2可以理解为,把1给了第一个变量,把2给了第二个变量,2解析出第二个变量给了b

练习:

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

!/bin/sh

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

if [ b ]

then

echo "b"

elif [ b ]

then

echo "b"

elif [ b ]

then

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

then

echo "b"

elif [ b ]

then

echo "b"

else

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

then

echo "b"

elif [ b ]

then

echo "b"

else

echo "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 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

……

你可能感兴趣的:(2019-04-09 Day-28 Shell编程基础)