Lesson41 Shell脚本中的变量
文章目录
1. 变量的定义
变量即在程序运行过程中它的值是允许改变的量
变量是用一串固定的字符来表示不固定的值的一种方法
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息
在shell中,变量是不能永久保存在系统中的,必须在文件中声明
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问
在指令式语言中,变量通常是可变的;但在纯函数式语言(如Haskell)中,变量可能是不可变(immutable)的
由于变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用
变量可以保存程序运行时用户输入的数据(如使用InputBox函数在屏幕上显示一个对话框,然后把用户键入的文本保存到变量中)
特定运算的结果以及要在窗体上显示的一段数据等,简而言之,变量是用于跟踪几乎所有类型信息的简单工具
变量声明后没有赋值的话 编译器会自动提示并赋予默认值
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息
例如,可以创建一个名为Click Count的变量来存储用户单击Web页面上某个对象的次数
使用变量并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值
在VB Script中只有一个基本数据类型,即Variant,因此所有变量的数据类型都是Variant
变量是内存当中一片区域的地址,其中存放的值是可变的
2. Shell脚本中变量的种类
在 shell 中,变量分为环境级变量、用户级变量、系统级变量三种
这三种变量的区别:
环境级变量只在当前 shell 中生效, shell 关闭变量丢失
用户级变量写在用户的骨文件(.bash_profile)中,只针对当前用户生效,切换用户后就不再生效
系统级变量被写在系统的配置文件 /etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效
环境级变量只在当前 shell 中生效, shell 关闭变量丢失 直接在shell当中设置
用户级变量写在用户的骨文件中,只针对当前用户生效 用户的骨文件一般都在用户的家目录下面(ls -a 查看隐藏的文件).bash_profile
cd /etc/skel这个目录下面存放的是新建用户的骨文件,也是隐藏文件
系统级变量被写在系统的配置文件 /etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效
3.1 环境级变量: 只针对当前shell生效
环境级,直接在shell中输入export a=1来定义变量
用户级,编辑家目录下面的用户级文件 vim ~/bash_profile,写入export a=1来定义变量
系统级,编辑系统的配置文件vim /etc/profile,写入export a=1来定义变量
vim test.sh #编辑测试文件test.sh
a=1
#在当前shell中定义变量a=1
vim test.sh #编辑测试的脚本
#!/bin/bash
echo $a #输出a的值
sh test.sh 看不到a的值,因为当前的shell是bash(a在这个shell里面)
sh这个shell里面没有a
echo $a #可以看到a的值
ps #可以看到当前环境是bash
export a=1 #使得所有的shell环境均识别这个a的值
cat test.sh #可以看到a的值
/mnt/test.sh #可以看到a的值
exit #关闭当前的shell
令b=1
重新打开一个shell
sh test.sh 就没有a的值
查看进程可以看到已经打开了两个shell
由于第二个变量没有加入系统,不是系统级变量,所以看不到值,新打开一个shell,就不能再查看到变量a的值了
3.2 用户级变量: 只针对当前的用户有效(写在当前用户的骨文件当中)
ls -a
#查看家目录下面的所有所有隐藏文件(以.开头的文件)
vim .bash_profile(编辑用户级的变量配置文件)
写入:export westos=1
给脚本可执行权限
source $westos
#执行使其生效
env
#可以查看添加进系统的变量
可以看到,westos变量的值为1
切换到student用户 输出westos变量
可以看到,westos变量里没有内容,可见,.bash_profile是用户级的变量配置文件
3.3 系统级的变量:写在系统的配置文件/etc/profile中,对所有的用户都生效
vim /etc/profile (编辑系统变量的配置文件)
写入:WESTOS=1
保存退出之后切换到student用户,可以看到,能够输出变量WESTOS的值为1
因此, /etc/profile 为系统级变量的配置文件
su - student( 加载/etc/bashrc和/etc/profile文件,系统级和用户级两个都读,切换用户身份以及用户在的环境)
su student(不加载系统中的环境变量,只读系统级一个,只切换用户身份)
系统级和用户级之间的关系:哪个的文件被随后读取,查看的就是哪个文件里面的值
shell的命令行也属于一个变量,也可以进行修改
4. shell中变量名称的规范
变量名称中通常包含大小写字母,数字,下划线
不是变量名中同时需要具备字母、数字、下划线,变量名只能出现这三种字符
变量名不能以数字开头,只能以字母或者下划线开头
变量名称格式定义:
WESTOS_LINUX
Westos_Linux
westoS_Linux
5. 字符的转译
字符 | 转译 |
---|---|
\ 反斜杠 | 转译单个字符 |
" "双引号 | 弱引用, 批量转译 “” 中出现的字符 |
’ '单引号 | 强引用, 批量转译 ‘’ 中出现的字符 |
’ '与 “ ” 两者的区别 | “ ” 不能转译 " \ 反斜杠","``反向单引号`","!感叹号","$" |
\转义单个字符或者字符串
''强引用,也是转义,可以转译元字符
""弱引用,也是转义,不能转译元字符
元字符: * # ? ! `` 这些字符都有自身的含义,需要转译
\ 反斜杠表示转译单个字符或字符串
元字符都有其特殊的含义,因此在使用时需要转译
' '单引号, 强引用, 批量转译 ‘’ 中出现的字符,将$a显示出来
" "双引号,弱引用, 批量转译 “ ” 中出现的字符, 不能转译元字符
6. 变量的声明(系统中存在的变量)
${}:变量声明
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[*]}输出数组的所有元素
定义一个数组a=(1 2 3)
echo $a #这种方式不是读取数组的方式
echo ${a[0]}输出数组的第一个元素
echo ${a[1]}输出数组的第二个元素
echo ${a[2]}输出数组的第二个元素
echo ${a[*]}输出数组的所有元素
7. 变量值传递
字符 | |
---|---|
$1 | 脚本后的第一串字符串 |
$2 | 脚本后的第二串字符串 |
$3 | 脚本后的第三串字符串 |
$# | 脚本后所跟字符串的个数 |
$* | 脚本后跟的所有字符串, 模式为“ 1 2 3 ” |
$@ | 脚本后跟的所有字符串,模式为“ 1”“2”“3” |
$$ | 当前进程的pid |
vim test1.sh编辑测试文件
写入内容:
#!/bin/bash
echo \$0 is $0
echo \$1 is $1
echo \$2 is $2
echo \$3 is $3
echo \$# is $#
echo \$* is $*
echo \$@ is $@
/mnt/test1.sh westos
$1是脚本后面的第一个字符
/mnt/test1.sh westos linux
$2是脚本后面的第一个字符
/mnt/test1.sh westos haha linux
$3是脚本后面的第一个字符
$#是脚本后面所跟字符的个数
$* 与 $@均是所有所跟字符(看起来作用一样,其实作用不一样)
编辑脚本测试文件test1.sh
写入内容,观察变量的传递
$
∗
与
*与
∗与 $@的区别
vim test1.sh
#编辑测试文件
写入:
for i in "$*"
do
echo $i
done
sh test1.sh 1 2 3 6
sh -x test1.sh 1 2 3 6($*代表只执行一次)
$*="1 2 3 6"
vim test1.sh
#编辑测试文件
可以看到,只执行了一次
写入:
for i in "$@"
do
echo $i
done
sh test1.sh 1 2 3 6
sh -x test1.sh 1 2 3 6($@代表执行了四次)
$@="1”,“2”,“3”,“6”
8. 利用命令执行结果设定变量
Hostname=$(hostname)
Hostname=`hostname`
第一种方式
可以看到,定义WESTOS为date,那么就会显示时间
第二种方式
可以看到,定义WESTOS为date,会显示时间
$? 是命令在执行完成之后产生的退出值,范围[0-255]
这个值可以用exit命令执行
exit 0
$?=0表示命令执行没有错误输出
echo $? 可以查看命令执行的错误编号
eg: exit 66
正确执行一个命令
echo $? 可以查看命令执行的错误编号,0表示没有错误输出
输入一个错误的命令
echo $? 可以查看命令执行的错误编号
编辑测试文件
写入以下内容
运行脚本,输出内容
echo $? #可以看到,输出为66
6. 用read实现变量传递(交互式变量传递)
read WESTOS
read -s WESTOS #隐藏输入的内容不在屏幕上显示
read -p “input:” WESTOS #交互变量,获取用户在屏幕上输入的内容
编辑test.sh脚本测试文件
写入以下内容,通过交互变量循环获取WORD变量的值并且显示出来,直到用户输入exit退出脚本程序
实验要求:编写一个create_user.sh脚本,建立用户lee,当用户存在时,显示“lee is exist ! Please input username:lee1”
当Lee1不存在,
Please inputpassword:
lee1建立并设定密码
Please input username :
exit 退出
9. Linux系统中命令别名的设定
/bin/ls
#执行/bin下的ls命令查看当前目录下的文件
ls 直接查看当前目录下的文件
可以看到,展现出来的文件虽然相同,但显示的效果不同,这是因为直接执行的ls命令实际是命令别名
ls=ls --color=auto
alias
#查看年系统中的命令别名
alias xie =‘vim’ #环境级命令别名的设定
vim ~/.bashrc #用户级命令别名的设定
alias xie='vim'
vim /etc/bashrc #系统级命令别名的设定
alais xie ='vim'
unalias xie #删除命令别名
9.1 环境级命令别名的设定
alias xie=‘vim’
#设定环境级的命令别名
可以看到,新设定的环境级命令别名在系统命令别名的列表里已经存在
执行xie /etc/passwd 可以看到,进入了/etc/passwd文件
只输入xie ,相当于输入vim
进入了vim的信息页面
重新打开一个shell,发现执行xie,会报命令错误,这是因为此时的xie命令仅仅只是环境级的命令别名,只在当前shell中有效
9.2 用户级命令别名的设定
vim /root/.bashrc
#编辑.bashrc文件
写入: alias xie = 'vim'
执行此脚本
输入xie命令,可以看到进入了vim的页面
切换到student用户,可以看到,xie命令无法执行
9.3 系统级命令别名的设定
vim /etc/bashrc
#编辑/etc/bashrc文件
写入: alias xie = 'vim'
切换到root用户
执行xie命令
可以看到此命令别名能够被系统识别
切换到student用户,执行xie命令
可以看到,xie命令这个别名可以被识别
10. 脚本函数
10.1 什么是脚本中的函数
首先得了解什么是脚本,脚本一般是网站的服务器端程序,主要用于动态网站的服务请求响应
故脚本函数就是写在脚本中的特定功能函数了
脚本中的函数是把一个复杂的语句块定义成一个字符串的方法
然后每次想使用某一个功能的时候,直接调用函数就可以
10.2 函数的定义
Shell中可以通过这两种方法定义函数
方法一:
function_name()
{
statement1
statement2
...
statementn
}
方法二:
function function_name()
{
statement2
...
statementn
}
10.3 函数的调用
当某个函数定义好以后,用户可以直接通过函数名来调用该函数了。在shell中,函数调用的基本语法如下:
function_name parm1 parm2
10.4 函数的返回值
用户利用return来返回某个数值,这个与绝大部分的程序设计语言是相同的。但是,在shell中, return只能返回某个0-255之间的整数值
在shell中还有一种方法帮助用户来获得函数执行后的结果,那就是使用echo。
在函数中,用户需要将返回的数据写入到标准输出(stdout),通常这个操作使用echo语句来完成 ,然后在调用程序中将函数的执行结果赋值给一个变量
shell中的函数(函数是一个功能,变量是值)
函数功能:将所有的功能集成在一块、可以实现循环执行