Linux命令(6/28)——declare/typeset命令

Posted konglingbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令(6/28)——declare/typeset命令相关的知识,希望对你有一定的参考价值。

declare 与 typeset 命令是bash的内建命令,两者是完全一样的,用来声明shell变量,设置变量的属性。

 declare命令(别名typeset)属shell内建命令,用于申明shell变量并设置变量属性,或查看已定义的shell变量和函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。

常用命令参数

  1. -r 设置变量为只读

  2. -i 设置变量为整数

  3. -a 设置变量为数组array

  4. -f 如果后面没有参数的话会列出之前脚本定义的所有函数,如果有参数的话列出以参数命名的函数

  5. -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没有设定nullstr为空字符串""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

 

我个人的理解是

-:变量中不包含后面字符串时

+:变量中包含后面字符串时

=:变量等于后面字符串时

?:输出

:冒号:变量为空字符串时取不加冒号时相反的动作

以上是关于Linux命令(6/28)——declare/typeset命令的主要内容,如果未能解决你的问题,请参考以下文章

没有那个文件或目录

linux上源码编译安装mysql-5.6.28

第一次作业:Linux 2.6.28进程模型与CFS调度器分析

关于Linux Kernel 2.6.28 以上有缺陷,在第208.5天自行重啟的问题

在Ubuntu中删除不需要的Linux内核

软件工程 2016.6.28 日报