Shell编程之变量(一)
目录
一、编程语言:
前言:由于电脑机器只能识别二进制文件,也就是0和1,但是人类是不方便使用0和1来进行程序编程,需要有个工具对人类文件进行转换成机器文件(二进制文件),那这个工具就是编译器和解释器了!
-
编译型
-
注释:编译型语言是把写好的源代码经过编译器转译后的文件,电脑能直接快速的读取!常见如:C、C++、Java....
-
特点:执行速度快,性能高,但是开发相周期长,对跨平台有要求,
-
场景:适合大型应用、操作系统、底层开发
-
-
解释型
- 注释:解释型语言是通过解释器逐行取读取解释源代码,解释一行执行一行!常见如:shell、python、js
- 特点:执行效率慢、跨平台性好、开发周期短
- 场景:适合脚本类、辅助类接口及便捷开发项目等对速度要求不苛刻的场景
二、Shell的介绍
1. shell
1. 什么是shell?
答:shell是一种解释器/人机沟通的桥梁,用于用户和电脑内核之间进行命令解释、交互的解释器,它介于linux内核与用户之间!
2. shell的分类:
答:通常说的shell指的是就/usr/bin/bash
[root@localhost home]# cat /etc/shells
/bin/sh # bash的快截版
/bin/bash # 大多数linux的内核都支持,通行版
/usr/bin/sh # 非交互、布恩那个登录操作系统
/usr/bin/bash # 缩小版,小巧且高效、功能少些
/bin/tcsh # 淘汰版
/bin/csh # 淘汰版
[root@localhost home]#
3.shell和我们常用的终端是什么关系?
答:shell是包含终端的,终端其实是开启shell进行人机交互的一种弹窗式的程序!
2. shell脚本
1. 什么是shell脚本?
答: 是由很多个命令集合+语法格式+要实现的业务逻辑=shell脚
2. 它的使用场景有哪些?
答: 把高重复的工作编写成sehll脚本,让其自动化完成
1) 自动化部署软件 如:LAMP / LNMP
2) 自动化管理软件 如:系统初始化、批量操作数据、定时推送代码
3) 自动化备份数据 如:数据库日常备份、日志日常备份
4) 自动化分析数据 如:统计网站人流量
5) 自动化监控脚本 如:网站爬虫监控、性能监控
3. 学习shell有什么技巧?
答:
1) 记更多的命令
2) 掌握脚本的语法格式
3) ***熟悉脚本的基本语法
4) ***多看——> 多写 ——> 多想多写
3. 写脚本
-
1、脚本的标准组成部分:
# 开头:指定该脚本使用哪个版本的的shell 代码: #!/bin/env bash (记得空格) # 中间:类似编程中的注释,建议养成编写的习惯 代码: # name: 该脚本作者名 # desc: 该脚本干嘛用的 # path: 该脚本的存放路径 # usage: 该脚本怎么使用 # update: 该脚本最后更新时间 # 尾部:脚本的业务功能实现 代码: ........ -
2、脚本的执行方式
1. 标准方式: 1. 脚本有执行权限 + 脚本的相对路径 代码演示: [root@localhost home]# cat test.sh #! /bin/env bash # name: xwh # desc: ce si # path: /home/test.sh # usage: bash /home/test.sh # update: 2020/11/30 echo 'helle world!' echo 'helle world!' echo 'helle world!' echo 'helle world!' [root@localhost home]# ./test.sh helle world! helle world! helle world! helle world! 2. 标本有执行权限 + 脚本的绝对路径 代码演示: [root@localhost home]# ./test.sh helle world! helle world! helle world! helle world! 2. 非标准方式: 语法格式: 1. bash 选项 脚本路径(绝对/相对) # 选项: -n 检查该脚本是否有语法错误 -x 查看脚本的执行全过程 2. source 脚本路径(绝对/相对) 代码演示: [root@localhost home]# cat test.sh #! /bin/env bash # name: xwh # desc: ce si # path: /home/test.sh # usage: bash /home/test.sh # update: 2020/11/30 echo 'helle world!' echo 'helle world!' echo 'helle world!' echo 'helle world!' [root@localhost home]# bash -n test.sh [root@localhost home]# bash -x test.sh + echo 'helle world!' helle world! + echo 'helle world!' helle world! + echo 'helle world!' helle world! + echo 'helle world!' helle world! [root@localhost home]# cd ../ [root@localhost /]# bash -x /home/test.sh + echo 'helle world!' helle world! + echo 'helle world!' helle world! + echo 'helle world!' helle world! + echo 'helle world!' helle world! [root@localt home]# source test.sh helle world! helle world! helle world! helle world!
三. 变量的定义规则
-
变量名严格区分大小写
[root@localhost home]# a=hello [root@localhost home]# A=HELLO [root@localhost home]# echo $a hello [root@localhost home]# echo $A HELLO -
变量名不能有特殊字符
当赋值给变量名的字符串存在空格时,请给值加上引号
[root@localhost home]# !a=123 bash: !a=123: event not found [root@localhost home]# @a=123 bash: @a=123: 未找到命令... [root@localhost home]# #a=123 [root@localhost home]# echo $#a 0a [root@localhost home]# echo ${#a} 5 [root@localhost home]# a=123 abc bash: abc: 未找到命令... [root@localhost home]# a='123 abc' [root@localhost home]# echo $a 123 abc [root@localhost home]# -
变量名不能以数字开头
# 这个规制跟python语法一样 [root@localhost home]# 2a=123 bash: 2a=123: 未找到命令... [root@localhost home]# a2=123\ > ^C [root@localhost home]# a2=123 [root@localhost home]# _a=123 [root@localhost home]# echo $a 123 [root@localhost home]# echo $_a 123 -
赋值变量时=两边不能有空格
[root@localhost home]# a=123 [root@localhost home]# a =123 bash: a: 未找到命令... -
起变量名尽量做到见名知意
# 这里不强求,但是建议这样做! shell没有跟python中大小驼峰的规则
四. 变量的定义方式
-
<1>、基本方式
# 定义变量语法:变量名=变量值 [root@localhost home]# name='zhang san' [root@localhost home]# echo $name zhang san [root@localhost home]# echo ${name} zhang san # 调取变量值方式: 1. echo $变量名 2. echo ${变量名} # 那 $和${}用法上有什么区别呢 区别: 1.当你调取变量的所有值时,$和${}效果一样 2. 当你要切片使用变量值时,只能用 echo ${变量名:numb1,numb2} [root@localhost home]# numb=1,2,3,4,5 [root@localhost home]# echo ${numb:1,3} ,3,4,5 -
<2>、直接把命令执行结果赋值给变量
# 方式一: 变量名=`命令` 代码: [root@localhost home]# uname -r 3.10.0-1127.el7.x86_64 [root@localhost home]# kernel=`uname -r` [root@localhost home]# echo $kernel 3.10.0-1127.el7.x86_64 # 方式二: 变量名=$(命令) 代码: [root@localhost home]# kernel2=$(uname -r) [root@localhost home]# echo $kernel2 3.10.0-1127.el7.x86_64 -
<3>、人机交互式定义变量
# 这个方式定义变量有什么场景呢? 答:这个类似python中的input函数的作用!当你写脚本需要获取主机的密码时,就需要用到这个模式! # 好处:用用户自己给变量赋值,灵活多变-
使用场景一:
# 用法一: 语法格式: read 选项 变量名 选项: -p: 定义提示用户的信息 -n: 定义字符数 -s: 不输入输入内容 -t: 定义过期时间 # 特别注意:-s和-p一起用时,-s必须在-p前面,不然报错! # 建议选项的前后优先顺序:-s > -n > -t > -p # 代码说明: [root@localhost home]# read -p 'Pales iuput your age:' age Pales iuput your age:29 [root@localhost home]# echo ${age} 29 [root@localhost home]# echo $age 29 [root@localhost home]# read -p -s 'input your Passwd' passwd -s123 bash: read: `input your Passwd': 不是有效的标识符 [root@localhost home]# read -s -p 'input your Passwd:' passwd input your Passwd:[root@localhost home]# echo ${passwd} 123 [root@localhost home]# [root@localhost home]# read -s -n 4 -t 10 -p 'input your Passwd:' passwd input your Passwd:[root@localhost home]# echo $passwd 123 [root@localhost home]# -
使用场景二:
# 用法二: 变量值取自某个文件 # 用法格式:read 选项 变量名1 变量名2 变量名3 < ip.txt # 注意(代码亲试):去文件提取多个变量名时,文件中对应的所有变量值必须是一行的,换行读取不到! # 代码: [root@localhost home]# cat ip.txt 192.168.124.255 255.255.255.0 192.168.124.140 [root@localhost home]# read -p 'input your cast/mask/ip:' cast mask ip < ip.txt [root@localhost home]# echo ${cast} 192.168.124.255 [root@localhost home]# echo ${mask} 255.255.255.0 [root@localhost home]# echo ${ip} 192.168.124.140
-
-
<4>、定义带类型的变量(declare)
好处: 把变量的类型定死,后续该变量只能是这个类型的数据 语法:declare 选项 变量名=变量值 选项: -i: 将变量定义成整数类型 如:declare -i a=123 -r: 定义只读变量 -a: 定义/查看 普通数组 -A: 定义/查看 关联数组 -x: 将本地变量变成环境变量,等同export 代码演示: [root@localhost home]# declare -i a=123456 [root@localhost home]# echo ${a} 123456 [root@localhost home]# a=678 [root@localhost home]# echo ${a} 678 [root@localhost home]# a=qwe [root@localhost home]# echo ${a} 0 [root@localhost home]# declare -r age=29 [root@localhost home]# age=30 bash: age: 只读变量 [root@localhost home]# [root@localhost home]# name=qqqq [root@localhost home]# env |grep name [root@localhost home]# declare -x name=qqqq [root@localhost home]# env|grep name name=qqqq
总结:
-
变量名的定义规则
1. 不能用数字开头,可以包含数字 2. 不能包含特殊字符如!@#¥/... 3. =两边不能有空格 4. 严格区分大小写 5. 当变量在赋值时,如果变量值是字符串且含有空格,必须用''或”“引起来 6. 变量名尽力见名知意 -
变量名的定义方式
一、基本方式 # 语法:变量名=值 # 调用: echo $变量名 echo ${变量名} # 区别:echo ${变量名:1,3}可以进行值得切片 二、命令结果赋值方式 1、变量名=`命令` 2、变量名=$(命令) 三、人机交互方式 1、read 选项 变量名 # 选项: -n: 限制输入长度 -s: 屏蔽输入值的显示 -t: 设置超时时间 -p: 定义提示信息 # 注意选项的前后优先级:建议 -s > -n > -t > -p 2、read 选项 变量名1 变量名2 变量名3 < 文件路径 # 注意: 去文件提取多个变量名时,文件中对应的所有变量值必须是一行的,换行读取不到! 四、定义带类型的变量方式 1、declare 选项 变量名 # 选项: -i: 把该变量固定为整形类型 -r: 把该变量固定为只读权限 -x: 把该变量从本地变量转成环境变量
浙公网安备 33010602011771号