Shell系统学习之Shell变量和引用

系列文章目录

Shell系统学习之什么是Shell

Shell系统学习之创建一个Shell程序

Shell系统学习之向Shell脚本传递参数

Shell系统学习之如何执行Shell程序

Shell系统学习之Shell变量和引用

 Shell系统学习之Shell条件测试,判断语句和运算符

 Shell系统学习之循环结构

 Shell系统学习之函数

Shell系统学习之数组

系统学习Shell之正则表达式

Shell系统学习之文件操作

Shell系统学习之子Shell与进程处理


目录

变量的类型

变量的定义

变量的作用域

系统变量

环境变量

变量的赋值与清空

引用变量的值

引用和替换

小结


变量的类型

 Shell是动态类型语言弱类型语言

动态类型语言表示变量类型是在程序运行过程中才确定的语言,除了Shell,比如还有Python,PHP,VB。

弱类型语言不要求用户明确指明变量类型,用户可以将任意类型的值复制给该变量。

在Shell中变量的类型无需显示地声明,变量的类型可以根据操作变化。准确地说,Shell中的变量是不分数据类型的,统一地按照字符串存储。但是根据上下文的变化,允许程序执行一些不同的操作,例如字符串的比较和整数的加减等。

#!/bin/bash
#!/bin/bash
#定义变量x,并赋值一个数字
x=123
#x加1
let "x+=1"
#显示x的值
echo "x=$x"

#赋值一个字符串
x=abc
echo "x=$x"
#x加1
let "x+=1"
#显示x的值
echo "x=$x"

#定义变量x为整数
typeset -i x
echo "x=$x"
#赋值一个字符串
x=abc
#显示x的值
echo "x=$x"

#赋值一个空字符串
x=""
echo "x=$x"
#x加1
let "x+=1"
#显示x的值
echo "x=$x"

实例代码展示了Shell变量的类型可变,x的值从整数可以变为字符串。

当x的值是字符串时,进行整数加减运算,会将Shell会自动进行数据类型的转换将x的值转换成0进行整数运算,这里的原理是:如果遇到含有非数字的字符串,则将字符串转成整数0.

从上面可以看出Shell的变量非常灵活,可以参与任何运算。实际上,在Shell中,一切变量都是字符串类型的。

变量的定义

在Shell中,通常情况下用户可以直接使用变量,无需事先定义,当用户第一次使用某变量名时,实际上就定义了该变量名

#!/bin/bash
#定义变量a
a=1
#定义变量b
b=hello
#定义变量c
c='hello world!'

如果值中包含特殊字符(空格,$, *等),需要用引号引用起来,这个后面详细讲。

以上方式可以非常方便的定义变量,但是对于变量的某些属性确不容易控制,例如:变量的类型和读写属性等。为了更好的控制变量的属性,bash提供了declare命令来声明变量,该命令的基本语法如下:

declare attribute variable

其中attribute表示变量的属性,常用的属性如下:

-i:将变量定义为整数。在之后可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0

-r:设置变量为只读。声明后不允许修改变量的值,也不允许删除

-x:将变量设置成环境变量,这样在随后的脚本和程序中可以使用

-f:显示所有自定义函数,包括名称和函数体

-p:显示所有变量的值

变量的作用域

Shell中的变量也分为全局变量和局部变量。

在Shell语言中,全局变量可以在脚本中定义,也可以在某个函数中定义。在脚本中定义的变量都是全局变量,其作用域为从被定义的地方开始,一直到本Shell脚本结束或者被显示的删除。

NOTE:这里的全局变量,没有特殊操作是影响不到在本Shell脚本中调用的其他脚本的。

下面实例分别演示在脚本定义和在函数中定义

#!/bin/bash

func()
{
    echo "$x"
    x=200
}

x=100
func
echo "$x"

运行结果为:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./3-5.sh 
100
200 

#!/bin/bash

func()
{
    x=200
}

func
echo "$x"

运行结果为:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./3-6.sh 
200

系统变量

Shell语言的系统变量主要是对参数运算、判断和命令返回值判断时使用。

Shell中常用的系统变量
变量说明
$n

n是一个整数,从1开始,表示第n个参数

$#表示命令行参数个数
$0       脚本文件名
$?前一个命令或者函数的返回状态码(0~255)
$*       以”参数1 参数2 ...“的形式返回所有参数
$@以”参数1“ ”参数2“ ...的形式返回每个参数
$$返回本程序的进程ID(PID)

小技巧:如何取第11个参数,不要使用$11,而是${11}。

环境变量

Shell环境变量是所有Shell程序都可以使用的变量。Shell程序执行时都会接收一组变量,它就是环境变量。

常用的Shell环境变量
变量       说明
PATH命令搜索路径,以冒号为分隔符。注意与windows不同的是,当前目录不再系统路径中
HOME用户主目录的路径名,是cd命令的默认参数
COLUMNS定义了命令编辑模式下可使用命令行的长度
HISTFILE命令历史文件
HISTSIZE命令历史文件中最多可包含的命令条数
HISTFILESIZE命令历史文件中包含的最大行数
IFS定义shell使用的分隔符
LOGNAME当前登录名
SHELLShell的全路路径名
TERM终端类型
TMOUTShell的自动退出时间,单位为秒,若设为0则禁止Shell自动退出
PWD当前工作目录

 除了上述的一些环境变量外,我们还可以使用set命令列出所有的环境变量

eden_ubuntu@edenubuntu:~/Documents/Shell$ set| more
BASH=/usr/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="10")
BASH_LINENO=()
BASH_REMATCH=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="5" [1]="0" [2]="17" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='5.0.17(1)-release'
COLORTERM=truecolor
COLUMNS=274
COMP_WORDBREAKS=$' \t\n"\'><=;|&(:'
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DESKTOP_SESSION=ubuntu
DIRSTACK=()
DISPLAY=:0
EUID=1000
GDMSESSION=ubuntu
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_SHELL_SESSION_MODE=ubuntu
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/171a6668_28b9_401a_b4b2_6bcc86fc3674
GNOME_TERMINAL_SERVICE=:1.81
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
GROUPS=()
GTK_MODULES=gail:atk-bridge
HISTCONTROL=ignoreboth
HISTFILE=/home/eden_ubuntu/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/eden_ubuntu
HOSTNAME=edenubuntu
HOSTTYPE=x86_64
IFS=$' \t\n'
IM_CONFIG_PHASE=1
INVOCATION_ID=265d2f7eed97448db9853b471edd6b39
JOURNAL_STREAM=8:60116
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
LINES=50
LOGNAME=eden_ubuntu

我们可以通过相应的变量名还获取使用它们。

变量的赋值与清空

变量赋值的语法:

variable_name=value

variable_name表示变量名,变量名只能包含 字符,数字和下划线,并且一定要以字符或者下划线开头。

value表示值,如果value中包含空格、制表符、换行符则必须用单引号或者双引号将其引用起来

注意,等号前后不要有空格 ,不然 会被理解为运算符,引发程序错误。

清空变量的语法

unset variable_name

 variable_name是要清楚的变量名

#!/bin/bash
x="hello world"
echo "$x"
unset x
echo "the value of x has been reset. x=$x"

结果如下:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./3-12.sh 
hello world
the value of x has been reset. x=

引用变量的值

当变量赋值完之后,就需要使用变量的值,Shell变量中的符号$表示取变量的值,只有在取值的时候才使用,定义和赋值时无需使用符号$(用C的理解是,右值才能使用,左值使用不了)。实际上,Shell中变量的原型是${var},而常用的书写形式$var只是一个简写。某些情况下,简写会导致程序错误。

示例如下:

#!/bin/bash
v1=Linux
v2=12345
v3="Ubuntu Linux"
v4="PATH=${PATH}"

echo "$v1"
echo "$v2"
echo "$v3"
echo "$v4"
#错误用法
echo "$v41"
#正确用法
echo "${v4}1"

结果如下:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./3-11.sh 
Linux
12345
Ubuntu Linux
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin1

可以发现

echo "$v41"输出的是空字符串,当Shell解释代码的时候,会认为v41是一个变量名,而v41并没有定义,Shell就会输出空字符串。而echo "${v4}1"可以可以正确输出

引用和替换

所谓的引用是指 将字符串用引用符号包括起来,以防止其中的特殊字符被Shell解释为其他涵义。特殊字符就是除了字面意思之外还可以解释为其他意思的字符。比如,$符号除了本身这个符号的显示意义,还可以用来获取某个变量的值;空格 符号也是,除了空格本身,也是Shell的命令解释间隔符等等。

在Shell中,一共有4种引用符号,如下表:

引用符号说明
单引号所有字符都将保持字面意义
双引号除了$,单引号、反引号、反斜线外,其他字符都将保持字面意义
反引号反引号中的字符将被解释为Shell命令 (键盘上~ 这个符号)
反斜线转义字符

重点关注下单引号和双引号的区别。如果我们需要使用特殊符号就需要用双引号!

被单引号引用起来 叫做全引用;被双引号引用起来叫做部分引用;

命令替换是指Shell程序中,将某个Shell命令的执行结果赋给某个变量。在bash中,有两种语法进行命令替换:

`shell_command`
$(shell_command)

以上两种语法是等价的。实例代码:

#!/bin/bash
v1=`pwd`
echo "current working directory is $v1"
v2=$(pwd)
echo "current working directory is $v2"

结果如下:

eden_ubuntu@edenubuntu:~/Documents/Shell$ ./3-16.sh 
current working directory is /home/eden_ubuntu/Documents/Shell
current working directory is /home/eden_ubuntu/Documents/Shell

 转义字符大家应该很熟悉了,这里就不多讲了。

小结

本篇文章主要介绍了Shell语言中的变量和引用的相关知识,重点掌握变量的定义方法、变量的作用域、常用的系统变量和环境变量的使用方法,以及全引用和部分引用

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值