变量
文章目录
- 变量
- 一、前言
- 二、变量
- 1.变量的类型
- 2.变量的运算
一、前言
1.什么是 shell
简介:
SHELL是UNIX系统的用户与操作系统之间的一种接口。它既是UNIX系统的命令解释程序,又是一种高级的命令程序设计语言。
作为命令解释程序,SHELL接收用户输入的命令,将命令翻译成一个动作序列,然后调用系统过程执行这条命令。
作为命令程序设计语言,SHELL具有一般高级语言的许多特征,如变量定义、赋值、条件和循环语句等。用户可以利用SHELL的这些功能将多条命令组织成一个命令程序,以完成某种特定的任务。这个命令程序称为SHELL程序或SHELL过程。
2.shell语言的特点
SHELL语言的优点在于:
1、SHELL语言非常适于编写小的CGI应用程序。UNIX系统中的SHELL语言是功能非常强大的编程工具。
2、Windows NT支持POSIX标准,这意味着大多数常用的UNIX工具(例如sh)都可以在NT中运行。
3、使用SHELL语言编写的应用程序短小精干,运行时不会产生类似Perl语言解释器之类的开销,并且易于实现在不同系统之间的移植。
SHELL语言的缺点在于:
1、SHELL语言没有象“真正”的编程语言那样,提供灵活且功能强大的控制结构。
2、在SHELL程序中常常需要不断地调用其它的工具(例如,grep、sed,甚至还有Perl)。
3.shell 能做什么?
1、自动化批量系统初始化程序( update、软件安装、时区设置、安全策略…)
2、自动化批量软件部署程序( LAMP、LNMP、Tomcat、LVS、Nginx)
3、应用管理程序( KVM、集群管理扩容、MySQL、DELLR720批量RAID)
4、日志分析处理程序(PV、UV、200代码、!200代码、top 100、grep/awk)
5、自动化备份恢复程序(MySQL完全备份/增量 + Crond)
6、自动化管理程序(批量远程修改密码、软件升级、配置更新)
7、自动化信息采集( 收集系统/应用状态信息、CPU、Mem、Disk、Net、TCP、Status、Apache、MySQL)
8、配合zabbix信息采集( 收集系统/应用状态信息、CPU、Mem、Disk、Net、TCP、Status、Apache、MySQL)
9、自动化扩容(增加云主机 ——> 业务上线)
zabbix监控CPU 80% + 50%Python API AWS/EC2 (增加/删除云主机)+ shell Script ( 业务上线)
10、俄罗斯方块、打印三角形、打印圣诞树、打印五角星、运行小火车、坦克大战、排序算法实现
11、shell可以做任何事(一切取决于业务需求!)
4.shell 执行方式
shell 多种执行方式
准备测试脚本
[root@apache 桌面]# vim file1
[root@apache 桌面]# cat file1
echo "hello,2023!"
read -p "请输入你的姓名:" name
echo "hello,$name"
执行1:bash ping01.sh
执行2:sh ping01.sh
执行3:. bash.sh
执行4:source bash.sh
[root@apache 桌面]# bash file1
hello,2023!
请输入你的姓名:guan
hello,guan
[root@apache 桌面]# sh file1
hello,2023!
请输入你的姓名:guan
hello,guan
[root@apache 桌面]# . file1
hello,2023!
请输入你的姓名:guan
hello,guan
[root@apache 桌面]# source file1
hello,2023!
请输入你的姓名:guan
hello,guan
5.多种执行方式的区别
1、准备环境
[root@apache 桌面]# vim bash.sh
[root@apache 桌面]# cat bash.sh
#!/bin/bash
cd /home
ls
2、1和2的方式是子shell(执行脚本没有改变目录路径位置)
[root@apache 桌面]# bash bash.sh
guan Guan guanguan Guanguan
[root@apache 桌面]# sh bash.sh
guan Guan guanguan Guanguan
[root@apache 桌面]# pwd
/root/桌面
3、3和4的方式是本shell(执行脚本改变了目录路径位置)
[root@apache 桌面]# . bash.sh
guan Guan guanguan Guanguan
[root@apache home]#
[root@apache 桌面]# source bash.sh
guan Guan guanguan Guanguan
[root@apache home]#
[root@apache home]# pwd
/home
6.shell 解释器有哪些?
[root@apache ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
[root@apache ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
二、变量
变量:用一个固定的字符串去表示不固定的内容,便于修改。
1.变量的类型
1、自定义变量
特性
自定义变量(例子:ping.sh 引入变量)
定义变量:变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip = 192.168.200.182
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名;"set"可以查看所有变量(包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围:仅当前 shell 中有效
例子
使用变量前
[root@apache 桌面]# vim ping.sh
[root@apache 桌面]# bash ping.sh
192.168.200.182up
PING 192.168.200.182 (192.168.200.182) 56(84) bytes of data.
64 bytes from 192.168.200.182: icmp_seq=1 ttl=64 time=0.057 ms
--- 192.168.200.182 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.057/0.057/0.057/0.000 ms
[root@apache 桌面]# cat ping.sh
#!/bin/bash
ping -c1 192.168.200.182 & > /dev/null && echo 192.168.200.182up || echo 192.168.200.182down
使用变量后
[root@apache 桌面]# vim ping.sh
[root@apache 桌面]# bash ping.sh
192.168.200.182 up
PING 192.168.200.182 (192.168.200.182) 56(84) bytes of data.
64 bytes from 192.168.200.182: icmp_seq=1 ttl=64 time=0.057 ms
--- 192.168.200.182 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.057/0.057/0.057/0.000 ms
[root@apache 桌面]# cat ping.sh
#!/bin/bash
ip=192.168.200.182
ping -c1 $ip & > /dev/null && echo "$ip up" || echo "$ip down"
作用 | |
---|---|
-c | 后跟执行次数 |
$ip | 使用变量,需要用$进行调用 |
&& | 只用在&&前面的指令执行完了才执行它之后的指令 |
|| | 相当于编程中的否则的作用 |
echo | 输出它之后的内容 |
变量赋值(定义变量):
1.显示赋值
[root@apache 桌面]# ip1=192.168.200.182
[root@apache 桌面]# echo ip1
ip1
[root@apache 桌面]# echo "ip1"
ip1
[root@apache 桌面]# echo $ip1
192.168.200.182
[root@apache 桌面]# school="NN university"
[root@apache 桌面]# echo $school
NN university
[root@apache 桌面]# date +%F
2022-12-28
[root@apache 桌面]# today01=`date +%F`
[root@apache 桌面]# echo $today01
2022-12-28
[root@apache 桌面]# today02=(date +%F)
[root@apache 桌面]# echo $today02
date
[root@apache 桌面]# today02=$(date +%F)
[root@apache 桌面]# echo $today02
2022-12-28
2.read 从键盘读入变量值
read 变量名
read -p “提示信息:” 变量名
read -t 5 -p “提示信息:” 变量名 //-t 等待 5 秒后超时
read -n 2 变量名 //-n 只记录几个字符
[root@apache 桌面]# vim ping.sh
[root@apache 桌面]# bash ping.sh
请输入测试的IP地址:192.168.200.182
192.168.200.182 up
PING 192.168.200.182 (192.168.200.182) 56(84) bytes of data.
64 bytes from 192.168.200.182: icmp_seq=1 ttl=64 time=0.063 ms
--- 192.168.200.182 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.063/0.063/0.063/0.000 ms
[root@apache 桌面]# cat ping.sh
#!/bin/bash
#ip=192.168.200.254
read -p "请输入测试的IP地址:" ip
ping -c1 $ip & > /dev/null && echo "$ip up" || echo "$ip down"
注意事项:3种引号
定义或引用变量时注意事项:
1." " 弱引用
[root@apache 桌面]# echo "${school} is good" //脱去空格
NN university is good
- ’ ’ 强引用
' ' 单引号内所有字符都不起作用,只是看到的字符而已
[root@apache 桌面]# echo '${school} is good' //脱去所有字符
${school} is good
[root@apache 桌面]#
- ` ` 优先执行
` ` 命令替换 等价于 $() 反引号中的shell命令会被先执行
[root@apache 桌面]# touch `date +%F`_file1.txt
[root@apache 桌面]# ls
2022-12-28_file1.txt
bash.sh
file1 ping.sh
[root@apache 桌面]# touch $(date +%F)_file2.txt
[root@apache 桌面]# ls
2022-12-28_file1.txt
2022-12-28_file2.txt
bash.sh
file1 ping.sh
2、环境变量
定义环境变量:
方法一:export back_dir2=/home/backup
方法二:export back_dir1 将自定义变量转换成环境变量
引用变量:$变量名 或 ${变量名}
查看环境变量:echo $变量名 env 例如 env | grep back_dir2
取消环境变量:unset 变量名
变量作用范围:在当前shell和子shell有效!
[root@apache 桌面]# export abc=123456
[root@apache 桌面]# echo $abc
123456
[root@apache 桌面]# unset abc
[root@apache 桌面]# echo $abc
//自定义变量与环境变量的区别是否在子shell1中起作用
[root@nfs 桌面]# guan=hello
[root@nfs 桌面]# bash
[root@nfs 桌面]# echo $hello
[root@nfs 桌面]#
[root@apache 桌面]# export abc=123456
[root@apache 桌面]# bash
[root@nfs 桌面]# echo $abc
123456
[root@nfs 桌面]# vim /etc/profile
[root@nfs 桌面]# tail -n 1 /etc/profile
export abc=hello //这是新添加的环境变量,要使它生效需要重启虚拟机,完成后用户可以使用这个环境变量
[root@nfs ~]# echo $abc
hello
3、位置变量和预定义变量
语法:
命令 参数1 参数2 参数3 … 参数9以后特殊定义
预先定义过的变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的 PID
$? 上一个命令的返回值 0 表示成功
列子
[root@nfs 桌面]# vim test.sh
[root@nfs 桌面]# bash test.sh
第1个位置参数是
第2个位置参数是
第3个位置参数是
第4个位置参数是
第5个位置参数是
第6个位置参数是
第7个位置参数是
第8个位置参数是
[root@nfs 桌面]# bash test.sh a b c d e
第1个位置参数是a
第2个位置参数是b
第3个位置参数是c
第4个位置参数是d
第5个位置参数是e
第6个位置参数是
第7个位置参数是
第8个位置参数是
[root@nfs 桌面]# cat test.sh
#!/bin/bash
echo "第1个位置参数是$1"
echo "第2个位置参数是$2"
echo "第3个位置参数是$3"
echo "第4个位置参数是$4"
echo "第5个位置参数是$5"
echo "第6个位置参数是$6"
echo "第7个位置参数是$7"
echo "第8个位置参数是$8"
[root@nfs 桌面]# cat test.sh
#!/bin/bash
echo "第1个位置参数是$1"
echo "第2个位置参数是$2"
echo "第3个位置参数是$3"
echo "第4个位置参数是$4"
echo "第5个位置参数是$5"
echo "第6个位置参数是$6"
echo "第7个位置参数是$7"
echo "第8个位置参数是$8"
echo "所有的参数是 $*"
echo "所有的参数是 $@"
echo "参数的个数是: $#"
echo "当前进程的 PID 是: $$"
sleep 30
echo "进程的名字是: $0"
ls /home111111
echo "该程序最后执行成功了吗? $?" //执行成功返回0,执行失败返回非0值
ls /home
echo "该程序最后执行成功了吗? $?"
[root@nfs 桌面]# vim test.sh
[root@nfs 桌面]# bash test.sh a b c
第1个位置参数是a
第2个位置参数是b
第3个位置参数是c
第4个位置参数是
第5个位置参数是
第6个位置参数是
第7个位置参数是
第8个位置参数是
所有的参数是 a b c
所有的参数是 a b c
参数的个数是: 3
当前进程的 PID 是: 9757
进程的名字是: test.sh
ls: 无法访问/home111111: 没有那个文件或目录
该程序最后执行成功了吗? 2
guan Guan guanguan Guanguan
该程序最后执行成功了吗? 0
$* 和 $@ 的区别
都是列出所有参数
2.变量的运算
1、整数运算
方法一:expr
语法:
expr 1+ 2
expr $num1 +(+ 、- 、* 、/ 、% ) $num2
(+ - * / % )
+ | 加 |
- | 减 |
\* | 乘 |
/ | 除 |
% | 取余 |
[root@nfs 桌面]# expr 1 + 1
2
[root@nfs 桌面]# num1=1
[root@nfs 桌面]# num2=2
[root@nfs 桌面]# num3=3
[root@nfs 桌面]# expr $num1 + $num2 + $num3
6
[root@nfs 桌面]#
方法二:$(( ))
[root@nfs 桌面]# num1=1
[root@nfs 桌面]# num2=2
[root@nfs 桌面]# num3=3
[root@nfs 桌面]# echo $((($num1 + $num2)*$num3))
9
[root@nfs 桌面]# num4=$((($num1 + $num2)*$num3))
[root@nfs 桌面]# echo $num4
9
[root@nfs 桌面]# num4=$((($num1 + $num2)*$num3));echo $num4
9
方法三:$[ ]
[root@nfs 桌面]# echo $[1*2*3]
6
方法四:let
[root@nfs 桌面]# let sum=1+2;echo $sum
3
[root@nfs 桌面]# let sum=$num1+$num2+$num3;echo $sum
6
[root@nfs 桌面]# let i++;echo $i
1
[root@nfs 桌面]# let i++;echo $i
2
[root@nfs 桌面]# let i++;echo $i
3
2、小数运算
[root@nfs 桌面]# 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'.
1.4*3
4.2
[root@nfs 桌面]# echo "scale=2;9/4" | bc //scale=为保留小数点多少位
2.25
[root@nfs 桌面]# echo "scale=4;9/4" | bc
2.2500
[root@nfs 桌面]# echo "scale=8;9/4" | bc
2.25000000
[root@nfs 桌面]# awk 'BEGIN{print 1/2}'
0.5
[root@nfs 桌面]# echo "print 5.0/2" | python
2.5
案列:
1、编写脚本,创建用户userA,并为用户设置初始密码为123456(无变量)
[root@nfs 桌面]# cat test01.sh
#!/bin/bash
useradd userA
echo "123456"|passwd --stdin userA & > /dev/null
echo "userA create finished the password is 123456"
2、编写脚本,创建用户userB,并为用户设置初始密码为123456(有变量)
[root@nfs 桌面]# cat test02.sh
#!/bin/bash
#useradd userA
name=userB
echo "123456"|passwd --stdin $name & > /dev/null
echo "$name create finished the password is 123456"
3、编写脚本,创建用户userA,并为用户设置初始密码为123456(有变量,键盘读取)
[root@nfs 桌面]# cat test03.sh
#!/bin/bash
#useradd userA
read -p "please input username:" name
useradd $name
echo "123456"|passwd --stdin $name & > /dev/null
echo "$name create finished the password is 123456"
4、编写脚本,配置本地 yum 源
[root@nfs 桌面]# cat yum.sh
#!/bin/bash
mount /dev/cdrom /mnt &> /dev/null
rm -rf /etc/yum.repos.d/yum.repo
cat << EOF > /etc/yum.repos.d/yum.repo
[local]
name=localyum
baseurl=file:///mnt
enable=1
gpgcheck=0
EOF
yum repolist all
[root@nfs 桌面]# bash test01.sh
userA create finished the password is 123456
更改用户 userA 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@nfs 桌面]# bash test02.sh
userB create finished the password is 123456
passwd:未知的用户名 userB。
[root@nfs 桌面]# bash test03.sh
please input username:userC
userC create finished the password is 123456
更改用户 userC 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@nfs 桌面]# cat /etc/passwd
userA:x:1004:1004::/home/userA:/bin/bash
userC:x:1005:1005::/home/userC:/bin/bash