1.2 shell的变量功能
首先给出变量的定义:
变量是指没有固定的值,可以改变的数。变量以非数字的符号来表达,一般用拉丁字母。
1.2.1 变量的设定与输出
变量的设定需要使用“=”,等号左边为变量名称,右边为变量内容,变量的定义遵循以下规则:
-
等号两边不能直接使用空格,如下所示为错误:
[haoqiqi@localhost ~]$ myname = haoqiqi bash: myname: 未找到命令... [haoqiqi@localhost ~]$ myname=hao qiqi bash: myname: 未找到命令...
-
变量名称不能只能是英文字母与数字,且开头不能是数字
-
若变量内容中含有空格,则需要将整个变量内容用双引号“或单引号‘引起来。
-
可使用跳脱字符”\“将特殊符号(如enter、$、\,空格等)变成一般字符
[haoqiqi@localhost ~]$ myname=hao\ qiqi
-
若变量为扩增变量内容时,需要使用”$变量内容“或"${变量}”累加内容,如下所示:
[haoqiqi@localhost ~]$ PATH="$PATH":/home/bin [haoqiqi@localhost ~]$ PATH="${PATH}:/home/bin"
-
使用export声明环境变量。
-
Linux系统默认的变量通常为大写
ps.自己命名的变量可以使用小写加以区分。 -
取消变量使用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相关说明。
2.\$:$表示当前shell的线程代号(Process ID),使用如下: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 目前使用者的账号名称 \v BASH的版本信息 \w 完整的工作目录名称,由根目录写起的目录名称。但家目录会以~取代 \W 利用basename函数取得工作目录名称,所以仅会列出最后一个目录名 \# 下达的笫几个指令 \$ 提示字符,如果是root时,提示字符为# ,否则就是$ [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=expr | var= | var=$str |
var=${str:expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} | str=expr var=expr | str 不变 var= | str 不变 var=$str |
本节内容就这些了, 欢迎关注我的微信公众号与我联系。