xie-wen-hui
船帆虽小,却也能远航!

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: 把该变量从本地变量转成环境变量
    	
    
    
posted on 2021-01-17 14:14  xie-wen-hui  阅读(98)  评论(0)    收藏  举报