【 shell 编程 】第1篇 变量

变量



在这里插入图片描述


一、前言

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


  1. ’ ’ 强引用

' ' 单引号内所有字符都不起作用,只是看到的字符而已

[root@apache 桌面]# echo '${school} is good' //脱去所有字符
${school} is good
[root@apache 桌面]# 
  1. ` ` 优先执行

` ` 命令替换 等价于 $() 反引号中的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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guan12319

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值