当前位置:网站首页>Shell变量和引用
Shell变量和引用
2022-07-26 12:16:00 【edenliuJ】
目录
变量的类型
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"运行结果为:
[email protected]:~/Documents/Shell$ ./3-5.sh
100
200
#!/bin/bash
func()
{
x=200
}
func
echo "$x"运行结果为:
[email protected]:~/Documents/Shell$ ./3-6.sh
200
系统变量
Shell语言的系统变量主要是对参数运算、判断和命令返回值判断时使用。
| 变量 | 说明 |
|---|---|
| $n | n是一个整数,从1开始,表示第n个参数 |
| $# | 表示命令行参数个数 |
| $0 | 脚本文件名 |
| $? | 前一个命令或者函数的返回状态码(0~255) |
| $* | 以”参数1 参数2 ...“的形式返回所有参数 |
| [email protected] | 以”参数1“ ”参数2“ ...的形式返回每个参数 |
| $$ | 返回本程序的进程ID(PID) |
小技巧:如何取第11个参数,不要使用$11,而是${11}。
环境变量
Shell环境变量是所有Shell程序都可以使用的变量。Shell程序执行时都会接收一组变量,它就是环境变量。
| 变量 | 说明 |
|---|---|
| PATH | 命令搜索路径,以冒号为分隔符。注意与windows不同的是,当前目录不再系统路径中 |
| HOME | 用户主目录的路径名,是cd命令的默认参数 |
| COLUMNS | 定义了命令编辑模式下可使用命令行的长度 |
| HISTFILE | 命令历史文件 |
| HISTSIZE | 命令历史文件中最多可包含的命令条数 |
| HISTFILESIZE | 命令历史文件中包含的最大行数 |
| IFS | 定义shell使用的分隔符 |
| LOGNAME | 当前登录名 |
| SHELL | Shell的全路路径名 |
| TERM | 终端类型 |
| TMOUT | Shell的自动退出时间,单位为秒,若设为0则禁止Shell自动退出 |
| PWD | 当前工作目录 |
除了上述的一些环境变量外,我们还可以使用set命令列出所有的环境变量
[email protected]:~/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"结果如下:
[email protected]:~/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"结果如下:
[email protected]:~/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"结果如下:
[email protected]:~/Documents/Shell$ ./3-16.sh
current working directory is /home/eden_ubuntu/Documents/Shell
current working directory is /home/eden_ubuntu/Documents/Shell
转义字符大家应该很熟悉了,这里就不多讲了。
小结
本篇文章主要介绍了Shell语言中的变量和引用的相关知识,重点掌握变量的定义方法、变量的作用域、常用的系统变量和环境变量的使用方法,以及全引用和部分引用
边栏推荐
- Redis实现Single单点登入详解
- The map function counts the number of occurrences of characters
- Data query of MySQL (aggregate function)
- Pytest interface automation test framework | pytest configuration file
- Pytoch deep learning quick start tutorial -- mound tutorial notes (II)
- 14.2字节流学习
- 2022就业季!Adobe助力创意产业工作者,突破技能桎梏,回归能力本源
- 【Mysql约束】
- How does the chain store cashier system help shoe stores manage their branches?
- yolov7训练危险品识别 pytorch
猜你喜欢

三维点云课程(八)——特征点匹配

Redis master-slave replication principle

海外APP推送(下篇):海外厂商通道集成指南

Problems encountered in byte stream exercises and Solutions

自定义浏览器默认右击菜单栏

2022 年要了解的新兴安全供应商

Network protocol: tcp/ip protocol

Pytoch deep learning quick start tutorial -- mound tutorial notes (I)

FPGA入门学习(二) - 二选一的选择器

敲黑板画重点:七种常见“分布式事务”详解
随机推荐
数智转型,管理先行|JNPF全力打造“全生命周期管理”平台
酷早报:7月25日Web3加密行业新闻大汇总
HTAP comes at a price
The map function counts the number of occurrences of characters
Real time synchronization and conversion of massive data based on Flink CDC
Detailed explanation of Legendre transformation and conjugate function
2022.7.23-----leetcode.剑指offer.115
Network protocol: tcp/ip protocol
Flink's real-time data analysis practice in iFLYTEK AI marketing business
基于STM32的SIM900A发送中文和英文短信
RFID的工作原理
Problems and solutions in the learning process of file class
请问下有人知道FlinkSQL 的 Retrack 在哪里可以指定吗? 网上资料只看到API 代码设
Hit the blackboard and draw the key points: a detailed explanation of seven common "distributed transactions"
Why is redis so fast? Redis threading model and redis multithreading
14.2 byte stream learning
2、 Container_
3D point cloud course (VIII) -- feature point matching
[Anhui University] information sharing of postgraduate entrance examination and re examination
QT入门引导 及其 案例讲解