41. Shell脚本中的变量

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中的函数(函数是一个功能,变量是值)
函数功能:将所有的功能集成在一块、可以实现循环执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值