shell脚本中的变量及变量传参详解
Posted 是大姚呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本中的变量及变量传参详解相关的知识,希望对你有一定的参考价值。
shell脚本中的变量及变量传参
文章目录
1、变量的定义
变量本质上就是一片内存区域的地址即寻址符号的别名,当我们运行shell脚本时命令无法操作一直变化的目标,所以需要引入变量来解决此问题,即用一串固定的字符来表示不固定的目标。
2、shell脚本中变量的定义方法
在定义变量时,变量名称中可包含的字符有字母、下划线和数字,变量名称不能以数字开头,一般在定义变量时我们建议:变量名称短全用大写字符如WESTOS;变量名称长用下划线_区分子类如Westos_Linux。除此之外,变量的定义还分为环境级别、用户级别和系统级别,具体内容我们将通过示例进行详细说明。
实验步骤:
1)当我们在当前shell环境中定义变量a的值为1时,使用echo $a
可以看到变量的值,编写脚本test.sh在脚本中写入echo $a
,运行该脚本显示结果为空,这是因为在当前shell环境中定义的变量是环境级别的变量,即只针对当前shell环境生效且在环境关闭后变量失效,脚本运行时是在当前shell中再开了一个shell环境(#!/bin/bash指定的环境),在子shell环境中没有变量a的定义,所以运行脚本显示结果为空
2)我们可以编辑 ~/.bash_profile文件,在其中添加变量a的声明语句export a=1
,source重新读取该文件使设定生效,给当前shell中的所有子程序环境传递变量值,此时运行test.sh脚本可以看到变量a的值,但当切换到westos用户中,再次运行test.sh脚本显示结果为空,这是因为编辑 ~/.bash_profile文件声明的变量是用户级别的变量,当切换到另一用户时变量失效
3)我们可以编辑/etc/profile文件来设定对于所有用户的所有环境都生效的系统级别的变量,但此文件内容较多,出于稳定性考虑不进行改动,我们一般选择在/etc/profile.d/目录下新建脚本文件写入变量a的声明语句export a=1
来设定用户级别的变量,此时切换到westos用户中运行test.sh脚本可以看到变量a的值
4)使用env
命令查看所有系统内键变量(系统级别的变量),可以看到我们定义的变量a
5)删除在/etc/profile.d/目录下写入变量a声明语句的脚本文件,删除~/.bash_profile文件中添加的变量a的声明语句export a=1
,source重新读取该文件,使用unset
命令删除变量a,此时使用env
命令查看所有系统内键变量没有变量a
6)PS1表示当前shell命令提示符变量,可以使用PS1=' '
临时更改设定命令提示符变量值,关闭后重新开启shell会复原(\\W表示显示当前路径,\\u表示显示当前登陆用户,\\h表示显示主机名,\\t表示显示时间)
3、变量的转译及数组
实验步骤:
1)变量$$
表示的是当前使用的进程id
2)使用echo命令可以输出显示一个$
符号,当需要输出显示两个$
符号时,为了避免命令将其作为变量$$
处理,我们要对多出的一个$
符号使用 \\ 进行转译,\\ 可以转译单个字符,当我们要输出显示多个特殊含义字符时,需要使用同样多个\\ 进行转译,更便捷的方法是使用双引号" " 弱引用或单引号’ ’ 强引用对多个字符进行批量转译
注意: 双引号" "弱转译不能转译反向单引号`;反斜杠\\;$符号;感叹号!
3)在当前shell环境中定义变量a的值为1、变量ab的值为2,使用echo $ab命令看到的是变量ab的值2,如果想要将变量a的值单独显示,需要用{}将变量a引起,此时使用echo $ab命令看到的是变量a的值1和字符b
4)定义含义多个变量的数组a:
echo $a
:默认显示数组a的第一个元素
echo ${a[0]}
:显示数组中第一个元素,以此类推
echo ${a[-1]}
: 显示数组中最后一个元素
echo ${a[*]}
和echo ${a[@]}
:显示数组中所有元素
echo ${#a[@]}
:显示数组中元素的个数
echo ${a[@]:起始元素id:元素个数]}
:显示数组中以起始元素为首的指定个数的元素(注意:这里起始元素id不能为负值)
unset a[n]
:删除数组中的第n个元素(删除后可通过a[n]=x
重新添加数组变量赋值)
unset a
:删除数组a
4、Linux中命令的别名设定
实验步骤:
1)在系统中我们可以使用ls命令查看当前所在目录中的内容,查看结果中不同内容会用相应颜色进行标识,但当我们使用/bin/ls查看当前所在目录中的内容时,查看结果没有颜色标识,这是因为/bin/ls是基本命令,而ls在系统中是ls --color=auto命令的别名(可以使用alias命令查看相关设定),因此在使用ls命令查看时,实际执行的不是基本命令/bin/ls,而是ls --color=auto
2)我们可以使用alias xie='vim'
命令在当前shell环境中临时设定xie为vim命令的别名,此时执行xie会进入vim编辑器,但当我们远程连接自身主机(即开启另一个shell环境)执行xie时系统会提示没有该命令,这是因为在当前shell环境中设置的命令别名是环境级别的别名,即只针对当前shell环境生效且在环境关闭后变量失效
3)我们可以编辑 ~/.bashrc文件,在其中添加命令别名的设定语句alias xie='vim'
,source重新读取该文件使设定生效,给当前shell中的所有子程序环境传递此设定,此时远程连接自身主机执行xie时会进入vim编辑器,但当切换到westos用户中,再次执行xie时系统会提示没有该命令,这是因为编辑 ~/.bashrc设定的命令别名是用户级别的别名,当切换到另一用户时命令别名设定失效
4)我们可以编辑/etc/bashrc文件来设定对于所有用户的所有环境都生效的系统级别的命令别名,在其中添加命令别名的设定语句alias xie='vim'
,source重新读取该文件使设定生效,此时切换到westos用户中执行xie时会进入vim编辑器
5)使用alias命令可以看到所有系统命令别名,此时可以看到我们定义的vim命令的别名xie
6)删除在/etc/bashrc文件和 ~/.bashrc文件中添加的命令别名设定语句,source重新读取两个文件,使用unalias
命令删除当前环境中的别名xie,此时使用alias命令查看所有系统命令别名没有vim命令的别名xie
5、用户环境变量的更改
实验步骤:
1)ls命令的绝对路径是/bin/ls,我们可以在系统的任意位置处直接使用ls命令查看当前所在目录中的内容,但不能在系统的任意位置处直接使用test.sh命令执行/mnt目录下的test.sh脚本,这是因为存在指引系统去哪些目录中寻找可执行的程序的系统环境变量$PATH
,在执行命令时系统会去这个变量的值里指定的目录中找可执行的程序,查看$PATH
变量的值可以看到其指定的目录中包含ls所在的/bin,所以我们可以在系统的任意位置处直接使用ls命令
2)我们可以编辑~/.bash_profile文件,在其中$PATH
变量值的设定语句中添加/mnt目录,source重新读取该文件使设定生效,给test.sh脚本添加可执行权限避免文件系统的权限影响我们的设定,此时在系统的任意位置处直接使用test.sh命令可以执行/mnt目录下的test.sh脚本,查看$PATH
变量的值可以看到其指定的目录中包含test.sh脚本所在的/mnt目录
3)当切换到westos用户中,不能在系统的任意位置处直接使用test.sh命令执行/mnt目录下的test.sh脚本,这是因为编辑~/.bash_profile设定的是用户级别的$PATH
变量值,当切换到另一用户时设定失效
我们可以编辑/etc/profile文件来设定对于所有用户的所有环境都生效的系统级别的$PATH
变量值,但此文件内容较多,出于稳定性考虑不进行改动,我们一般选择在/etc/profile.d/目录下新建脚本文件写入$PATH
变量的声明语句来设定其变量值、添加/mnt目录,此时切换到westos用户中在系统的任意位置处直接使用test.sh命令可以执行/mnt目录下的test.sh脚本
6、shell脚本中的变量传参
shell脚本中的变量传参分为非交互模式传参和交互模式传参两种,具体内容我们将通过示例进行详细说明。
实验步骤:
1)编写westos.sh脚本如下,使用非交互模式传参时,脚本中各变量的含义为:
$0
:脚本本身
$1
:脚本后输入的第一串字符
$2
:脚本后输入的第二串字符(以此类推)
$*
:脚本后输入的所有字符
$@
:脚本后输入的所有字符
$#
:脚本后输入的字符串个数
注意: $*
和$@
变量都表示的是脚本后输入的所有字符,但其本质上是不同的, $*
变量会将脚本后输入的多个字符串当做一整个字符串读取,而$@
变量会对脚本后输入的多个字符串进行分别读取
2)我们可以编写westos.sh脚本,在循环语句中执行显示$*
变量读取的参数值的命令,在运行脚本时使用-x 参数显示脚本运行过程,可以看到脚本只执行了一次输出显示操作,这说明了$*
变量会将脚本后输入的多个字符串当做一整个字符串读取
3)修改westos.sh脚本,在循环语句中执行显示$@
变量读取的参数值的命令,在运行脚本时使用-x 参数显示脚本运行过程,可以看到脚本执行了三次输出显示操作,这说明了$@
变量会对脚本后输入的多个字符串进行分别读取
4)新建编写test.sh脚本,使用交互模式传参:read
读取脚本后输入的字符串后将其赋值给变量WORD,- p参数表示输出提示语,-s参数表示隐藏输入内容
7、脚本函数
脚本函数本质上就是程序的别名,其设定方式如下:
函数名称()
{
action1
action2
}
函数名称 ##在脚本中该函数名称就代表了action1 action2这两个命令动作
实验步骤:
1)编辑脚本test.sh,在其中编写脚本函数READ:输出提示语提示用户输入字符串,隐藏输入内容并读取用户输入的字符串将其赋值给变量WORD,判断变量WORD的值是否为exit,如果是exit则提示bye并退出脚本运行,如果不是exit则输出显示用户输入的字符串并再次调用脚本函数READ,至此脚本函数READ编写完成,在脚本中调用该函数
2)编写创建用户的脚本create_user.sh,在执行该脚本时提示请输入用户名,当输入的用户名为exit时脚本退出运行,当输入的用户名不为exit时判断该用户是否存在,如果用户存在则输出用户已存在并再次提示请输入用户名,如果用户不存在则提示请输入密码并隐藏用户输入的密码,此用户会自动建立并且密码为提示后输入的密码,接着显示用户建立完成并再次提示请输入用户名
以上是关于shell脚本中的变量及变量传参详解的主要内容,如果未能解决你的问题,请参考以下文章