linux shell编程及自动化运维实现
第一章 变量
一、shell 前言
1、shell语言的特点:
-
SHELL语言是指Unix操作系统的命令语言,同时又是该命令语言的解释程序的简称。
-
shell本身是一个用c语言编写的程序,它是用户使用unix/linux的桥梁,用户的大部分工作都是通过shell完成的。
-
shell即是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令。
-
作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
-
它虽然不是unix/linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序。
-
建立文件并以并行的方式协调各个程序的运行。
-
因此,对于用户来说,shell是最重要的实用程序。
-
深入了解和熟练掌握shell的特性及其使用方法,是用好unix/linux系统的关键。
2、shell能做什么:
3、shell执行方式
shell多种执行方式:
[root@localhost] vim file1
echo "hello 2020"
read -p "请输入您的姓名:" name
echo "哈哈$name是大笨蛋"
执行1:bash file1
[root@localhost] bash file1
hello 2022
请输入您的姓名:666
哈哈哈666是大笨蛋
执行2:sh file1
[root@localhost] sh file1
hello 2022
请输入您的姓名:666
哈哈哈666是大笨蛋
执行3:. file1
[root@localhost] . file1
hello 2022
请输入您的姓名:666
哈哈哈666是大笨蛋
执行3:source file1
[root@localhost] source file1
hello 2022
请输入您的姓名:666
哈哈哈666是大笨蛋
多种执行方式的区别:
准备环境:
[root@localhost] ls /home
aofa
vim bash.sh
cd /home
ls
1和2的方式,是子shell,执行完不影响本shell。
[root@localhost~] bash
[root@localhost~] exit
[root@localhost] bash bash.sh
aofa
[root@localhost~] sh bash.sh
aofa
[root@localhost~] pwd
/root
3和4的方式,是本shell ,执行完改变本shell。
[root@localhost~] . bash.sh
aofa
[root@localhost home] pwd
/home
[root@localhost~] source bash.sh
aofa
[root@localhost home] pwd
/home
4、shell解释器的位置
[root@localhost ~] which bash
/usr/bin/bash
[root@localhost ~] cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
二、变量
简介:shell变量用一个固定的字符串去表示不固定的内容,便于修改
==简述:==用户自定义变量是最常见的变量类型,其特点是变量名和变量值都是由用户自由定义的。
学习要点:
1、自定义变量
自定义变量只在当前shell内生效
定义变量
该如何定义变量呢?很简单,只需执行“变量名=变量值”命令即可,不过要遵守变量定义规则。例如:
[root@localhost ~] name="hyb 666"
变量调用
当我们需要提取变量中的内容时,需要在变量名之前加入“$”符号。那么最简单的变量调用就是通过echo命令输出变量的值。命令如下:
[root@localhost ~] name="hyb 666"
[root@localhost ~] echo $name
hyb 666
变量的定义就是这么简单,但是如果不遵守变量定义规则,就会报错:比如:
变量名不能以数字开头
[root@localhost ~] 2name="hyb 666"
bash: 2name=hyb 666: 未找到命令...
等号左右两边不能有空格
[root@localhost ~] name = "hyb 666"
bash: name: 未找到命令...
变量的值如果有空格,必须用引号包含
[root@localhost ~]
bash: 666: 未找到命令...
重复定义变量
重复定义变量会进行变量叠加 例如:
[root@localhost ~] aa=123
[root@localhost ~] aa="$aa"456
[root@localhost ~] echo $aa
123456
调用变量aa,发现值已经变成了123456
[root@localhost ~] aa=${aa}789
[root@localhost ~] echo $aa
123456789
- 这里要小心,在进行变量叠加时,变量名需要用双引号或${}包含。
[root@localhost ~] echo ${name}
hyb 666
[root@localhost ~] echo "$name"
hyb 666
变量查看
我们可以通过echo命令查询已经设定的变量的值,这种查询是已知变量名查询变量值。但是如果我不知道变量值,那么可以查询系统中已存在的变量吗?
[root@localhost ~] set | grep name
变量删除
想要删除自定义变量,可以使用unset命令。命令格式如下
[root@localhost ~] unset 变量名
这条命令执行之后,再查询变量,就会发现这个变量已经为空了
[root@localhost ~] unset name
[root@localhost ~] echo $name
输出是空的
示例
需求:编写测试主机在线的脚本,当主机在线提示在线,当主机不在线提示不在线
编写脚本:
[root@localhost ~] vim ping.sh
ping -c 1 192.168.18.2 &> /dev/null && echo 192.168.18.2up || echo 192.168.18.2down
注释:
&&和||是三目表达式
&&前面的命令成功,执行后面的命令
||前面的命令失败,执行后面的命令
[root@localhost ~] bash ping.sh
192.168.18.2up
授权脚本:
[root@localhost ~] chmod +x ping.sh
执行脚本:
[root@localhost ~] . ping.sh
192.168.18.2up
思考:
如果更换测试IP,需要修改脚本的哪些部分?需要修改三个部分
编写脚本:
[root@localhost ~] vim ping.sh
ip=192.168.18.2
ping -c 1 $ip &> /dev/null && echo $ip up || echo $ip down
授权脚本:
[root@localhost ~] chomd +x ping.sh
执行脚本:
[root@localhost ~] ./ping.sh
192.168.18.2 up
交互定义变量
赋值方法:read 变量名
示例:
[root@localhost ~] vim 1.sh
read -p "请输入您的外号:" name
echo "宇宙最帅的男人就是:" $name
[root@localhost ~] chmod +x 1.sh
[root@localhost ~] . 1.sh
请输入您的外号:hyb
宇宙最帅的男人就是: hyb
[root@localhost ~] vim ping.sh
read -p "请输入您需要测试的第一个IP:" ip1
ping -c 1 $ip1 &> /dev/null && echo $ip1 up || echo $ip1 down
read -p "请输入您需要测试的第二个IP:" ip2
ping -c 1 $ip2 &> /dev/null && echo $ip2 up || echo $ip2 down
read -p "请输入您需要测试的第三个IP:" ip3
ping -c 1 $ip3 &> /dev/null && echo $ip3 up || echo $ip2 down
[root@localhost ~] chmod +x ping.sh
[root@localhost ~] . ping.sh
请输入您需要测试的第一个IP:192.168.18.1
192.168.18.1 down
请输入您需要测试的第二个IP:192.168.18.2
192.168.18.2 up
请输入您需要测试的第三个IP:192.168.18.145
192.168.18.145 up
定义或引用变量时注意事项:
- “ ”弱引用:一般去掉引号内空格的含义
[root@localhost ~] school=1000 phone
bash: phone: 未找到命令...
[root@localhost ~] school="1000 phone"
[root@localhost ~] echo $school
1000 phone
[root@localhost ~] school=$school is good
bash: is: 未找到命令...
[root@localhost ~] school="$school is good"
[root@localhost ~] echo $school
1000 phone is good
- ‘ ’ 强引用:引号内一切符号失去作用
[root@localhost ~] school='$school 666'
[root@localhost ~] echo $school
$school 666
- `` 反引号:命令优先执行
[root@localhost ~] school=date
[root@localhost ~] echo $school
date
[root@localhost ~] school=`date`
[root@localhost ~] echo $school
2022年 11月 03日 星期四 10:07:27 CST
注意
变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名需遵循如下规则:
2、整数运算
这里我们只需要掌握一种整数运算的方法4种方法没有高低优劣之分,在企业当中看到其他3种方法你只需要认识看得懂别人的代码就可以。
方法一:expr
语法:
[root@localhost ~] expr 1 + 2
3
[root@localhost ~] expr 2 \* 4
8
[root@localhost ~] num1=16
[root@localhost ~] num2=4
[root@localhost ~] expr $num1 + $num2
20
案例:
需求:运算学员的成绩总分
制作脚本:
[root@localhost ~] vim sum.sh
read -p "请输入您的第一门成绩:" number1
read -p "请输入您的第二门成绩:" number2
echo -n "总成绩是:"
expr $number1 + $number2
[root@localhost ~] chmod +x sum.sh
[root@localhost ~] ./sum.sh
请输入您的第一门成绩:34
请输入您的第二门成绩:43
总成绩是:77
[root@localhost ~] vim sum.sh
read -p "请输入您的第一门成绩:" number1
read -p "请输入您的第二门成绩:" number2
num=`expr $number1 + $number2`
echo $num
[root@localhost ~] ./sum.sh
请输入您的第一门成绩:32
请输入您的第二门成绩:453
485
方法二:$(())
[root@localhost ~] echo $((2**3))
8
[root@localhost ~] sum=$((2+2)) ; echo $sum
4
方法三:$[ ]
[root@localhost ~] echo $[6+6]
12
方法四:let
[root@localhost ~] num1=21
[root@localhost ~] num2=22
[root@localhost ~] let sum=$num1+$num2
[root@localhost ~] echo $sum
43
[root@localhost ~] let i++ ; echo $i
1
[root@localhost ~] let i++ ; echo $i
2
[root@localhost ~] let i++ ; echo $i
3
3、小数运算(了解)
前提得安装一个会算小数的程序bc
[root@localhost ~] yum install -y bc
[root@localhost ~] echo "2+4" | bc
6
[root@localhost ~] bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2+4
6
6+6
12
[root@localhost ~] echo "scale=2 ; 6/4" | bc
1.50
4、环境变量(了解)
前言
自定义变量,只能在当前shell生成。其他shell是不生效的。说白了,你的变量只能你用,那如果有些变量,需要所有用户都使用该怎么办呢、
定义环境变量
方法: export 声明变量 当前shell和子shell
[root@localhost ~] name=hyb
[root@localhost ~] echo $name
hyb
[root@localhost ~] export name
[root@localhost ~] bash
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt/cdrom 忙
/dev/sr0 已经挂载到 /mnt/cdrom 上
[root@localhost ~] echo $name
hyb
5、位置变量和预定义变量
位置变量语法
位置变量:可以调用命令 参数1 参数2 参数3…9 9以后重新定义 $0 $1 $2…$9…
系统已经定义好的所以直接调用就行,参数必须跟在代码的后面
[root@localhost ~] vim ping.sh
ping -c 1 $1 &> /dev/null && echo $1 up || echo $1 down
ping -c 1 $2 &> /dev/null && echo $2 up || echo $2 down
ping -c 1 $3 &> /dev/null && echo $3 up || echo $2 down
[root@localhost ~] chmod +x ping.sh
[root@localhost ~] ./ping.sh 192.168.18.1 192.168.18.2 192.168.18.3
192.168.18.1 down
192.168.18.2 up
192.168.18.2 down
示例
需求:制定脚本程序,用户自行输入两门学科的成绩(整数),自动算出平均分。
制作脚本:
[root@localhost ~] vim avg.sh
echo "($1+$2)/2" | bc
[root@localhost ~] chmod +x avg.sh
[root@localhost ~] ./avg.sh 43 32
37
[root@localhost ~] ./avg.sh 50 50
50
预定义变量
预先定好的变量
$0脚本名/程序名 本身没有意义
[root@localhost ~] vim avg.sh
echo "($1+$2)/2" | bc
echo "这个程序的名字叫$0"
[root@localhost ~] ./avg.sh 50 50
50
这个程序的名字叫./avg.sh
$#参数的个数
[root@localhost ~] vim avg.sh
echo "($1+$2)/2" | bc
echo "这个程序的名字叫$0"
echo "这个程序有 $# 个参数"
[root@localhost ~] ./avg.sh 50 50
50
这个程序的名字叫./avg.sh
这个程序有 2 个参数
$*参数有哪些
[root@localhost ~] vim avg.sh
echo "($1+$2)/2" | bc
echo "这个程序的名字叫$0"
echo "这个程序有 $# 个参数"
echo "该程序当中的参数有$*"
[root@localhost ~]
50
这个程序的名字叫./avg.sh
这个程序有 2 个参数
该程序当中的参数有50 50
$#参数的个数
[root@localhost ~] vim avg.sh
echo "($1+$2)/2" | bc
echo "这个程序的名字叫$0"
echo "这个程序有 $# 个参数"
[root@localhost ~] ./avg.sh 50 50
50
这个程序的名字叫./avg.sh
这个程序有 2 个参数
$*参数有哪些
[root@localhost ~] vim avg.sh
echo "($1+$2)/2" | bc
echo "这个程序的名字叫$0"
echo "这个程序有 $# 个参数"
echo "该程序当中的参数有$*"
[root@localhost ~]
50
这个程序的名字叫./avg.sh
这个程序有 2 个参数
该程序当中的参数有50 50
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)