1.2 shell的变量功能

1.2 shell的变量功能

首先给出变量的定义:
变量是指没有固定的值,可以改变的数。变量以非数字的符号来表达,一般用拉丁字母。

1.2.1 变量的设定与输出

变量的设定需要使用“=”,等号左边为变量名称,右边为变量内容,变量的定义遵循以下规则:

  1. 等号两边不能直接使用空格,如下所示为错误:

    [haoqiqi@localhost ~]$ myname = haoqiqi
    bash: myname: 未找到命令...
    [haoqiqi@localhost ~]$ myname=hao qiqi
    bash: myname: 未找到命令...
    
  2. 变量名称不能只能是英文字母与数字,且开头不能是数字

  3. 若变量内容中含有空格,则需要将整个变量内容用双引号“或单引号‘引起来。

  4. 可使用跳脱字符”\“将特殊符号(如enter、$、\,空格等)变成一般字符

    [haoqiqi@localhost ~]$ myname=hao\ qiqi
    
  5. 若变量为扩增变量内容时,需要使用”$变量内容“或"${变量}”累加内容,如下所示:

    [haoqiqi@localhost ~]$ PATH="$PATH":/home/bin
    [haoqiqi@localhost ~]$ PATH="${PATH}:/home/bin"
    
  6. 使用export声明环境变量。

  7. Linux系统默认的变量通常为大写
    ps.自己命名的变量可以使用小写加以区分。

  8. 取消变量使用unset,例如:

    [haoqiqi@localhost ~]$ unset myname
    
    

要输出变量时,需要用到echo,使用形式如下:

echo ${变量名}
[haoqiqi@localhost ~]$ myname=hao\ qiqi
[haoqiqi@localhost ~]$ echo ${myname}
hao qiqi

1.2.2 全局(环境)变量

全局变量是指在整个环境即所有文件下都管用的变量,能够被子程序所引用。子程序只能继承父程序的全局变量,不能继承父程序的局部(自定义)变量。
在shell环境中,可以利用env、set、export查看全局变量。

  • env,environment(环境)的缩写。

    [haoqiqi@localhost ~]$ env
    
    XDG_VTNR=1
    SSH_AGENT_PID=2352
    XDG_SESSION_ID=1
    HOSTNAME=localhost.localdomain      				<==这个终端机使用的环境是什么类型
    IMSETTINGS_INTEGRATE_DESKTOP=yes
    VTE_VERSION=5202
    TERM=xterm-256color										<==这个终端机使用的环境是什么类型
    SHELL=/bin/bash													<==目前这个环境下,使用的Shell程序
    XDG_MENU_PREFIX=gnome-
    HISTSIZE=1000												<=="记录抬令的笔数",在CentOS默认可记录1000笔
    GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/8e8133aa_786c_48b9_87e2_6912d6a819c2																	<== —些颜色显示
    IMSETTINGS_MODULE=none
    USER=haoqiqi													<== 使用者的名称
    ...太多了,以下省略。
    

    下面挑出来几个重要的环境变量:

    1.HOME:用户的家目录
    2.SHELL:当前环境正在使用的shell程序
    3.HISTSIZE:与”历史命令(history)“有关,此项是设定保存历史命令的最大条数
    4.MAIL:当用户使用mail收信时,系统会读取的邮箱文件
    5.PATH:文件路径。目录之间使用”:“分隔
    6.LANG:语系数据
    7.PANDOM:随机数生成器,值介于0~32767之间

  • set:观察所有变量(含环境变量与自定义变量)
    以下仅列举出中重要的内容:
    1.PS1:提示字符的设定,即命令提示符。默认为’[\u@h \W]$‘。其符号含义可以使用 man bash查询PS1相关说明。

    PS1中符号的含义说明
    \d可显示出『星期月 日】的日期格式,如:"Mon Feb 2"。
    \H完整的主机名
    \h仅取主机名在第一个小数点之前的名字
    \t显示时间为24小时格式”HH:MM:SS“
    \T显示时间为12小时格式”HH:MM:SS“
    \A显示时间,为24小时格式”HH:MM“
    \@显示时间为12小时格式的”am/pm“ 样式
    \u目前使用者的账号名称
    \vBASH的版本信息
    \w完整的工作目录名称,由根目录写起的目录名称。但家目录会以~取代
    \W利用basename函数取得工作目录名称,所以仅会列出最后一个目录名
    \#下达的笫几个指令
    \$提示字符,如果是root时,提示字符为# ,否则就是$
    2.\$:$表示当前shell的线程代号(Process ID),使用如下:
    [haoqiqi@localhost ~]$ echo $$
    8367
    
    

    3.?:上一个执行的指令回传的值。注意是”上一个指令“与”回传值“。一般来说,当成功运行指令代码时,回传值为0,若回传值不为0则表示代码执行失败。举例如下:

    [haoqiqi@localhost ~]$ echo $name
    
    [haoqiqi@localhost ~]$ echo $?
    0
    [haoqiqi@localhost ~]$ 12=vir
    bash: 12=vir: 未找到命令...
    [haoqiqi@localhost ~]$ echo $?
    127
    [haoqiqi@localhost ~]$ echo $?
    0
    

    请注意最后两句的区别。

  • export:自定义变量转成环境变量。使用规则如下:

[haoqiqi@localhost ~]$ export 变量名称

1.2.3 变量键盘输入、数组与宣告

1.2.3.1 read:读取键盘

读取来自键盘的变量,c++中使用cin,MATLAB、shell中使用read,但是用法不同。

[haoqiqi@localhost ~]$ read [-pt]variable
read 读取指令
-p:后面可以接提示字符!
-t:后面可以接等待时间,单位为秒。

例示:

[haoqiqi@localhost ~]$ read myname
haoqiqi
[haoqiqi@localhost ~]$ echo ${myname}
haoqiqi
1.2.3.2 数组变量

数组的定义方式如下:

var[index]=content
var表示数组名
index表示变量位置
content表示内容
注意:等号两侧不能加空格

举例如下:

[haoqiqi@localhost ~]$ var[1]="first"
[haoqiqi@localhost ~]$ var[2]="secend"
[haoqiqi@localhost ~]$ var[3]="third"
[haoqiqi@localhost ~]$ echo "${var[1]},${var[2]},${var[3]}"
first,secend,third
1.2.3.3 declare/typeset:宣告变量的类型

若declare后面没有加参数,则会输出所有的变量名称与内容,与set类似。
declare后加参数:

[haoqiqi@localhost ~]$ declare [-aixr]variable
选项与参数:
-a:将后面名为variable的变量定义为数组(array)类型
-i:将后面名为variable的变量定义为整数数字(integer)类型
-x:用法与export一样,声明全局变量
-r:将变量设定为只读(readonly)型

举例:

[haoqiqi@localhost ~]$ sum=100+200+300
[haoqiqi@localhost ~]$ echo ${sum}
100+200+300
[haoqiqi@localhost ~]$ declare -i sum1=100+200+300
[haoqiqi@localhost ~]$ echo ${sum1}
600
1.2.3.4 变量内容的删除、取代(Optional)
  • 从前到后删除变量:#
  • 从后向前删除变量:%
  • 数据的取代:/
变量的设定方式说明
${变量#关键词}若变量内容 从前到后 的数据包含”关键词“,则将符合的 最短数据 删除
${变量##关键词}若变量内容 从前到后 的数据包含”关键词“,则将符合的 最长数据 删除
${变量%关键词}若变量内容 从后向前 的数据符合”关键词“,则将符合的 最短数据 删除
${变量%%关键词}若变量内容 从后向前 的数据包含”关键词“,则将符合的 最长数据 删除
${变量/旧字符串/新字符串}若变量内容包含”旧字符串“,则将第一个旧字符串取代为新字符串
${变量//旧字符串//新字符串}若变量内容包含”旧字符串“,则将所有的旧字符串取代为新字符串
举例如下:
[haoqiqi@localhost ~]$ path=${PATH}
[haoqiqi@localhost ~]$ echo ${path}
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/haoqiqi/.local/bin:/home/haoqiqi/bin
[haoqiqi@localhost ~]$ echo ${path#/*local/bin:}
/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/haoqiqi/.local/bin:/home/haoqiqi/bin
 对${path#/*local/bin:}的解释:
 #表示从前向后删除
 /*local/bin: 表示需要被删除的部分,由/开始,*取代0到无穷多任意字符

删除部分如下:
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/haoqiqi/.local/bin:/home/haoqiqi/bin

[haoqiqi@localhost ~]$ path=${PATH}
[haoqiqi@localhost ~]$ echo ${path}
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/haoqiqi/.local/bin:/home/haoqiqi/bin
[haoqiqi@localhost ~]$ echo ${path//sbin/SBIN}
/usr/local/bin:/usr/local/SBIN:/usr/bin:/usr/SBIN:/bin:/SBIN:/home/haoqiqi/.local/bin:/home/haoqiqi/bin
1.2.3.5 变量的测试与内容替换

测试方法:

[haoqiqi@localhost ~]$ new_var=${old_var-content}
其关键符号为减号”-“,若old_var存在,则new_var等于old_var,否则等于content

举例如下:

[haoqiqi@localhost ~]$ echo ${myname}
							注意这里是返回值为空,不是我故意留的空行
[haoqiqi@localhost ~]$ username=${myname-yourname}
[haoqiqi@localhost ~]$ echo ${username}
yourname
[haoqiqi@localhost ~]$ myname="haoqiqi"
[haoqiqi@localhost ~]$ username=${myname-yourname}
[haoqiqi@localhost ~]$ echo ${username}
haoqiqi

其它测试与替换操作:
var与str为变量,针对str是否设定决定var的值。

变量设定方式str没有设定str为空字符串str为非空字符串
var=${str-expr}var=exprvar= var=$str
var=${str:expr}var=exprvar=exprvar=$str
var=${str+expr}var= var=exprvar=expr
var=${str:+expr}var= var= var=expr
var=${str=expr}str=expr
var=expr
str 不变
var=
str 不变
var=$str

本节内容就这些了, 欢迎关注我的微信公众号与我联系。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值