declare 与 typeset 命令是bash的内建命令,两者是完全一样的,用来声明shell变量,设置变量的属性。
declare命令(别名typeset)属shell内建命令,用于申明shell变量并设置变量属性,或查看已定义的shell变量和函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。
常用命令参数
-
-r 设置变量为只读
-
-i 设置变量为整数
-
-a 设置变量为数组array
-
-f 如果后面没有参数的话会列出之前脚本定义的所有函数,如果有参数的话列出以参数命名的函数
-
-x 设置变量在脚本外也可以访问到
-a:申明数组变量 -A:申明关联数组,可以使用字符串作为数组索引 -f:仅显示已定义的函数 -F:不显示函数定义 -i:声明整型变量 -l:将变量值的小写字母变为小写 -u:变量值的大写字母变为大写 -r:设置只读属性 -t:设置变量跟踪属性,用于跟踪函数进行调试,对于变量没有特殊意义 -x:将指定的shell变量换成环境变量 -p:显示变量定义的方式和值 +:取消变量属性,但是+a和+r无效,无法删除数组和只读属性,可以使用unset删除数组,但是unset不能删除只读变量
(1)定义关联数组并访问。
declare -A assArray=([lucy]=beijing [yoona]=shanghai)
#读取关联数组全部内容
echo ${assArray[*]}
#或
echo ${assArray[@]}
#输出
beijing shanghai
#读取指定索引的数组值
echo ${assArray[lucy]}
#输出:
beijing
#列出数组索引列表
echo ${!assArray[*]}
#或
echo ${!assArray[@]}
#输出
yoona lucy
(2)定义只读变量
declare -r name1="lvlv1"
#或
typeset -r name2="lvlv2"
#或
readonly name3="lvlv3"
Shell规定,只读变量生命周期与当前Shell脚本进程相同,且不能消除只读属性和删除只读变量,除非kill当前Shell脚本进程。
(3)使用-p
选项显示变量name1和name2的定义方式和当前值。
declare -p name1 name2 name3
#输出
declare -r name1="lvlv1"
declare -r name2="lvlv2"
declare -r name3="lvlv3"
(4)使用-x
选项将shell变量转换为临时环境变量,供当前Shell会话的其他shell进程使用,退出当前Shell会话则失效。
declare -x name1;
(5)显示所有shell环境变量。
declare -x
(6)使用+x
选项取消变量为环境变量。
delcare +x name1
(7)申明整型变量,赋值浮点型数值将报错。
declare -i integer=666
格式:declare -p var
格式:typeset -p var
显示指定变量var的值。
格式:declare var=value
格式:typeset var=value
格式:var=value
声明变量并赋值。
格式:declare -i var
格式:typeset -i var
将变量var定义成整数。在之后就可以直接对表达式求值,结果只能是整数。如果求值失败或者不是整数,就设置为0。
格式:declare -r var
格式:typeset -r var
格式:readonly var
将变量var声明为只读变量。只读变量不允许修改,也不允许删除。
格式:declare -a var
格式:typeset -a var
将变量var声明为数组变量。但这没有必要。所有变量都不必显式定义就可以用作数组。事实上,在某种意义上,似乎所有变量都是数组,而且赋值给没有下标的变量与赋值给"[0]"相同。
格式:declare -f
格式:typeset -f
显示所有自定义函数,包括名称和函数体。
格式:declare -F
格式:typeset -F
显示所有自定义函数名称。
格式:declare -f func
格式:typeset -f func
只显示指定函数func的函数定义。
格式:declare -x var
格式:typeset -x var
格式:export var
将变量var设置成环境变量,这样在随后的脚本和程序中可以使用。
格式:declare -x var=value
格式:typeset -x var=value
格式:export var=value
将变量var设置成环境变量,并赋值为value。
Linux下Bash的变量使用,echo,read,declare,typeset,array,local
变量设定规则
1、变量与变量内容用一个等号来连接
myname=del1214
2、等号两边不能直接接空格,下面的赋值是错误的
myname = del1214 或 myname= del 1214
3、变量名只能是英文字母与数字,但第一个字符不能使数字,下面是错误的
1myname=del1214
4、变量内容有空格符可以用双引号"或单引号'使内容连接起来,但
双引号内的特殊字符$,可以保留原有的特性,如下:
var="lang is $LANG" 则echo $var 显示 lang is en_US
单引号内的特殊字符则为一般字符,如下:
var='lang is $LANG' 则echo $var 显示 lang is $LANG
5、使用转义字符将特殊符号(回车,$,\,空格,'等)变成一般字符
6、在变量中使用命令,需要用`命令`或$(命令),例如取得内核版本号
version=$(uname -r)
echo $version
2.6.xxxxxxxxx
7、变量内容相加(字符串相加),使用"$变量名"或${变量},例如:
PATH="$PATH":/home/bin
8、将变量转为环境变量,使用export命令
export PATH
9、环境变量一般为全大写字母,自定义变量使用小写字母
10、取消变量命令unset,unset 变量名
变量由键盘输入read
要读取来自键盘输入的变量,使用read指令
read [-pt] 变量名
-p: 后面接提示字符
-t: 后面接等待的秒数
例如:
read -p "please type your name" -t 10 yourname
变量类型的定义declare/typeset
declare
declare [-aixr] 变量名
-a: 将后面的变量名定义为数组array类型
-i: 将后面的变量名定义为整数数字integer类型
-x: 将后面的变量名定义为环境变量,功能同export
+x: 取消环境变量
-r: 将变量名定义为readonly类ing,不能更改不能unset
只读属性一旦确定,只能通过注销再登陆来恢复该变量的类型
bash对变量类型的基本定义
变量类型默认为字符串,不明确指定类型就是字符串,1+2是字符串不会自动算成3
bash中的数值运算只能是整数,1/3结果是0
typeset
typeset [-aAfFgilrtux] [-p] name[=value]
说明不是很全,还是用declare吧
变量中数组array的使用
设定方法:
var[index]=content
例如:
var[1]="aaa"
var[2]="bbb"
var[3]="ccc"
echo "${var[1]},${var[2]},${var[3]}"
aaa,bbb,ccc
变量内容的删除与替换
变量设定方式 | 说明 |
---|---|
${变量#关键词} ${变量##关键词} |
若变量内容从【头】开始的数据符合关键词,则将符合的最【短】数据删除 若变量内容从【头】开始的数据符合关键词,则将符合的最【长】数据删除 |
${变量%关键词} ${变量%%关键词} |
若变量内容【从后向前】的数据符合关键词,则将符合的最【短】数据删除 若变量内容【从后向前】的数据符合关键词,则将符合的最【长】数据删除 |
${变量/旧字符串/新字符串} ${变量//旧字符串/新字符串} |
若变量内容符合旧字符串则【第一个】旧字符串会被新字符串取代 若变量内容符合旧字符串则【全部的】旧字符串会被新字符串取代 |
变量内容的判断与替换
变量设定方式 | str没有设定null | str为空字符串"" | str已设定为非空字符串 |
---|---|---|---|
var=${str-expr} var=${str:-expr} |
var=expr var=expr |
var= var=expr |
var=$str var=$str |
var=${str+expr} | var= | var=expr | var=expr |
var=${str:+expr} | var= | var= | var=expr |
var=${str=expr} var=${str:=expr} |
str=expr var=expr str=expr var=expr |
str不变 var= str=expr var=expr |
str不变 var=$str str不变 var=$str |
var=${str?expr} | expr输出至stderr | var= | var=$str |
var=${str:?expr} | expr输出至stderr | expr输出至stderr | var=$str |
我个人的理解是
-:变量中不包含后面字符串时
+:变量中包含后面字符串时
=:变量等于后面字符串时
?:输出
:冒号:变量为空字符串时取不加冒号时相反的动作