文章目录
一、变量的概念
- 变量的定义:变量即在程序运行过程中它的值是允许改变的量,变量是计算机内存的单元,其中存放的值可以改变。
- 变量是用一串固定的字符来标示不固定的值的一种方法
- 变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息
- 在shell中变量是不能永久保存在系统中的,必须在文件中声明
二、变量的分类及其设定
- 在shell中变量分为三类:环境级变量,用户级变量,系统级变量
- 环境级变量只在当前 shell 中生效, shell 关闭变量丢失
- 用户级变量写在用户的骨文件中,只针对当前用户生效
- 系统级变量写在系统的配置文件 /etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效
2.1 三种变量的设定
环境级变量 : 直接在shell中输入export A=1来声明
环境级变量:只针对当前shell生效
export a=2使得所有的shell环境均识别这个a的值
重新打开一个shell,echo $a 就没有a的值
用户级变量,只针对当前的用户有效(写在当前用户的骨文件当中)
(1)ls -a 可以查看家目录下面的所有所有隐藏文件(以.开头的文件)
(2)vim .bash_profile(编辑用户级的变量配置文件) 加入export ranran=1
(3)source .bash_profile 使文件生效
(4)su - student 切换到student 用户,且切换环境即shell,发现不可以查看ranran的值。
(5)su student只切换到student用户,不切换用户root的shell,发现可以查看。
(6)bash 在root用户的shell中新打开一个shell,发现可以生效
- su student与su - student的本质区别:
su:切换用户后,不改变原用户的工作目录以及其他环境变量目录,只读系统级一个。
su-: 切换用户后,同时切换到新用户的工作环境中,系统级和用户级两个都读
系统级的变量:写在系统的配置文件/etc/profile中,对所有的用户都生效
(1)vim /etc/profile (编辑系统变量的配置文件)
(2) source /etc/profile 使文件生效
(3)su - student 切换到student 用户,且切换环境即shell,发现可以查看chen的值。
(4)bash 在root用户的shell中新打开一个shell,发现可以查看chen的值。
三、shell中的变量
3.1 shell变量命名规则
- 变量名必须是以字母或下划线字符“_”开头,后面跟字母、数字或下划线字符
- 不可以使用? 、*或其他特殊字符命名变量。
- 变量名和等号之间不能有空格
3.2 shell变量字符的转译(元字符存疑)
字符 | 含义 |
---|---|
\反斜杠 | 转译单个字符 |
""双引号 | 弱引用 |
‘’ 单引号 | 强引用 |
注意:
- 强引用:单引号括起来的字符都作为普通字符出现。
- 弱引用:双引号括起来的字符除 $ 、\ (反斜杠) 、`(反引号) 和 "(双引号) 这四个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。
- 元字符(* # ? ! 反向单引号)这些字符都有自身的含义,需要转义。
3.3 shell变量的声明
shell变量的声明 | $ { }
a=1在shell中直接定义a的值为1
echo $ab(默认会寻找ab这个整体的变量的值)
echo ${a}b这样才能声明a是变量
a=(1 2 3)定义一个数组
echo $a不可以
echo ${a[0]}输出数组的第一个元素
echo ${a[1]}输出数组的第二个元素
echo ${a[*]}输出数组的所有元素
3.4 shell变量值传递
字符 | 含义 |
---|---|
$1 | 脚本后的第一串字符串 |
$2 | 脚本后的第二串字符串 |
$n | 脚本后的第n串字符串 |
$# | 脚本后所跟字符串的个数 |
$* | 脚本后跟的所有字符串,模式为“ 1 2 3 ” |
$@ | 脚本后跟的所有字符串,模式为“ 1”“2”“3” |
$$ | 当前进程的pid |
$! | 后台运行的最后一个进程的ID号 |
(1)首先编写一个脚本test.sh
(2)通过调用脚本来查看这些变量都代表什么值
(3)在脚本中加入watch -n 1 date
(4)执行脚本,然后ctrl+z把结果打入后台,ps f可以看到当前shell的pid,与$$对应,kill -9 结束当前进程
(5)删除脚本中watch -n 1 date
(6)sh test.sh ran1 ran2 ran3
$@,$*的区别 :
- 假设在脚本运行时写了三个参数 1、2、3,则 " * " 等价于 “1 2 3”(传递了一个参数,只执行一次),而 “@” 等价于 “1” “2” “3”(传递了三个参数,执行三次)。
(1)$* 传递了一个参数,只执行一次
(2)$@ 传递了三个参数,执行三次
四、shell中交互式变量(read)
4.1什么是交互式变量
shell等待你的输入,并且立即执行你提交的命令。比如passwd命令。
4.2编写脚本实现交互式的操作
read -p " " | 显示输入内容
read -p -s " " | 不回显
(1)vim test.sh 编写一个简单的shell脚本
输入什么,显示什么
#!/bin/bash
read -p "Please input yourname: " RANRAN 使用read命令实现交互式
echo "$RANRAN"
(2)sh test.sh 执行脚本
4.3 脚本: 判断某ip是否可以ping通?
要求 : 用户自己输入要ping的ip地址,然后通了输出up,不通输出down
#!/bin/bash
read -p "Please input IP:" IP ##用户输入要ping的ip
ping -w1 -c1 $IP &> /dev/null && { ##ping一秒一次且过程打入垃圾箱
echo -e "\033[32m$IP is up\033[0m" ## 如果可以ping通,就输出绿色ip is up
}||{
echo -e "\033[31m$IP is down\033[0m" ## 如果可以ping不通,就输出红色ip is down
}
4.4 脚本:用户管理(当输入-d是删除用户,-c是新建用户并且改密码,输入不是-d和-c时候,报错)
五、命令的别名设置
(1)alias 查看已有的alias别名
(2)自己手动设置命令的别名
环境级:设置别名 alias ran=‘vim’ ;删除别名 unalias ran
用户级:编辑文件 .bashrc 添加alias ran=‘vim’
系统级:编辑文件/etc/bashrc 添加alias ran=‘vim’
环境级 只在当前shall生效
(1)alias ran='vim’
(2)ran 出现 vim的效果
(3)bash 新打开一个shell失效
用户级 : 只在当前用户生效
(1)vim .bashrc 编辑用户级文件,添加alias ran=‘vim’
(2)切换用户到student,无法使用vim的别名
系统级
(1)vim /etc/bashrc 写入 alias ran=‘vim’
(2)切换用户到student,可以使用vim的别名
六、引用变量的两种方式
- 引用变量就是:让系统识别这个变量
- 有两种方式:$() 和 ``
- ``适合于所有的,反向单引号
- $()适合于shell
(1)
echo `date`
echo $(date)
(2)编辑一个Perl语言脚本 vim test.prl
发现报错,perl并不识别$(),vim修改为``引用
七、命令执行结束后的退出值$?
- 我们执行结束命令后无法确认所执行的命令是否成功的情况下,我们都会使用echo $? 来进行测试。
- 当一个进程执行完毕时,该进程会调用一个名为_exit的例程来通知内核它已经做好"消亡"的准备了。该进程会提供一个退出码(一个整数)表明它准备退出的原因。按照惯例,0用来表示正常或者说"成功"的终止。当然,我们也可以自己指定退出值。我们执行echo $?时返回的值就是进程的退出码,而且,这个退出码是由刚刚执行完的进程提供给系统内核的。
- 执行完成之后产生的退出值,范围是 0到255
- 返回值的大概含义:
(1)
(2)编辑测试脚本
(3)执行成功,退出值为0
(3)在测试文件中,指定正常执行退出值为7
八、shell脚本中的函数
- 什么是脚本中的函数: 首先得了解什么是脚本,脚本一般是网站服务器端程序,主要用于动态网站的服务请求响应,故脚本函数就是写在脚本中的特定功能函数。
- 脚本中的函数是把一个复杂的语句块定义为一个字符串的方法,然后每次想使用某个功能的时候,直接调用函数。
- 通过使用函数可以提高程序的可读性和重用性,避免重复编写相同的代码
简单函数示例
可见我没有将echo -e这段代码反复的使用,而是定义了一个RED函数,然后只需要输入RED后面加内容,即可得到想要的东西
8.1 函数的调用
当函数定义好了后,用户就可以通过函数名调用该函数了,在shell中,函数调用的基本语法如下
function_name parm1 parm2
8.2 函数的返回值
- 用户利用return来返回某个数值,再shell中,return语句只能返回某个0-255的整数值,再shell中还有一种方法获得函数执行的结果,就是使用echo。
- shell中的函数(函数是一个功能,变量是值)
- 函数功能:将所有的功能集成再一起,可以实现循环执行
示例:显示颜色
ECHO()来定义ECHO函数