Linux shell编程学习笔记32:declare 命令

news2025/1/12 21:07:30

0 前言

Linux shell编程学习笔记16:bash中的关联数组icon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/134053506?spm=1001.2014.3001.5501

中,我们在定义关联数组时使用了declare命令。

其实,declare命令的功能不只是定义定义关联数组,现在我们就来探讨它的功能和用法。

1 declare 命令的功能和格式

我们可以使用 命令 help declare  查看 的功能和格式

purpleEndurer @ bash $ help declare 
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.
    
    Declare variables and give them attributes.  If no NAMEs are given,
    display the attributes and values of all variables.
    
    Options:
      -f        restrict action or display to function names and definitions
      -F        restrict display to function names only (plus line number and
        source file when debugging)
      -g        create global variables when used in a shell function; otherwise
        ignored
      -p        display the attributes and value of each NAME
    
    Options which set attributes:
      -a        to make NAMEs indexed arrays (if supported)
      -A        to make NAMEs associative arrays (if supported)
      -i        to make NAMEs have the `integer' attribute
      -l        to convert NAMEs to lower case on assignment
      -r        to make NAMEs readonly
      -t        to make NAMEs have the `trace' attribute
      -u        to convert NAMEs to upper case on assignment
      -x        to make NAMEs export
    
    Using `+' instead of `-' turns off the given attribute.
    
    Variables with the integer attribute have arithmetic evaluation (see
    the `let' command) performed when the variable is assigned a value.
    
    When used in a function, `declare' makes NAMEs local, as with the `local'
    command.  The `-g' option suppresses this behavior.
    
    Exit Status:
    Returns success unless an invalid option is supplied or an error occurs.

 1.1 功能

declare命令的功能是 查看 或 设置变量值和属性;查看自定义函数的名称和定义。
    

1.2 格式

declare [-aAfFgilrtux] [-p] [变量名[=值] ...]

选项说明:

选项功能描述备注
-a使 指定变量名 成为索引数组(如果支持)属性选项,indexed arrays
-A使 指定变量名 成为关联数组(如果支持)属性选项,ssociative arrays
-f将操作或显示限制为函数名称和定义function
-F将显示限制为仅函数名称(加上行号和调试时的源文件)function
-g在 shell 函数中使用时创建全局变量;否则忽视global
-i使 指定变量名 具有“整数”属性属性选项,integer
-l在赋值时将 指定变量名 转换为小写属性选项,lower case
-p显示每个 指定变量名 的属性和值display
-r 使 指定变量名 只读属性选项,readonly
-t使 指定变量名 具有“trace”属性属性选项,trace
-u在赋值时将 指定变量名转换为大写属性选项,upper case
-x使 指定变量名导出属性选项,export

对于属性选项,"-"可用来指定变量的属性,"+"则是取消变量所设的属性。

  • 注意:如果同时对多个变量进行操作,变量名之间用空格分隔

2 用法和实例

2.1 declare : 显示用户的shell变量 (局部变量和环境变量)和自定义函数

purpleEndurer @ bash $ declare | more
BASH=/usr/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=144
DIRSTACK=()
EUID=1000
GROUPS=()
HISTFILE=/home/csdn/.bash_history
HISTFILESIZE=500
HISTSIZE=500
HOME=/home/csdn
HOSTNAME=edu
HOSTTYPE=x86_64
IFS=$' \t\n'
LC_ALL=zh_CN.UTF-8
LESS=-R
LINES=32
LOGNAME=csdn
LSCOLORS=Gxfxcxdxbxegedabagacad
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41
:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;3
1:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=
01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=0
1;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=0
--More--

LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41
:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;3
1:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=
01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=0
1;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=0
1;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.
mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;
35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01
;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav
=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PAGER=less
PATH=/home/csdn/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PIPESTATUS=([0]="0")
PPID=50
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='purpleEndurer @ bash $ '
PS2='> '
PS4='+ '
PWD=/home/csdn
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=2
TERM=xterm
UID=1000
ZSH=/home/csdn/.oh-my-zsh
_=declare
colors=/home/csdn/.dircolors
purpleEndurer @ bash $  

由于当前用户没有自定义函数,所以目前只能看到变量的信息。

 

2.2 declare -i 变量名1[=值1] ……:声明整数型变量

例:声明整数型变量a和b,并初始化其值分别为1和2,然后显示a和b的值,再显示a与b的和

purpleEndurer @ bash $ declare -i a=1 b=2
purpleEndurer @ bash $ echo $a,$b
1,2
purpleEndurer @ bash $ echo $[ a + b ]
3

2.3  declare +属性 变量名:取消变量属性

例:声明整数型变量a和b,并初始化其值分别为1和2,然后给a赋值'a'。

purpleEndurer @ bash $ declare -i a=1 b=1 #声明整数型变量a和b,并初始化其值分别为1和2
purpleEndurer @ bash $ a='a' b='b'   #给变量a赋值'a',变量b赋值'b'
purpleEndurer @ bash $ echo $a $b #显示a和b的值
1 1
purpleEndurer @ bash $ declare +i a #取消变量a的整数属性
purpleEndurer @ bash $ a='a' b='b'
purpleEndurer @ bash $ echo $a $b #显示a和b的值
a 1
purpleEndurer @ bash $ 

可以看到,在 声明整数型变量a和b,并初始化其值分别为1和2后,直接给整型变量a和b赋字符串值是无效的。

需要取消变量a的整数属性后,才能给变量a赋字符串值'a'。

 2.4 declare -r 变量名[=值]……:定义只读变量

定义只读整数变量c并初始化值为1

purpleEndurer @ bash ~ $ declare -ri c=1
purpleEndurer @ bash ~ $ echo $c
1
purpleEndurer @ bash ~ $ c=2
bash: c: readonly variable
purpleEndurer @ bash ~ $ declare +r c
bash: declare: c: readonly variable

只读变量的值无法更改。

无法用declare +r 来去除变量c的只读属性。

2.5 [declare -a ]索引数组名[=(值1 值2 ……) ]:定义索引数组

例:定义索引数组a并初始化,然后显示其值: 

purpleEndurer @ bash ~ $ declare -a a=(1 'a' b)
purpleEndurer @ bash ~ $ echo ${a[*]}
1 a b

关于索引数组的更多知识,可以回顾:

 Linux shell编程学习笔记15:定义数组、获取数组元素值和长度、数组拼接或合并icon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/134009982?spm=1001.2014.3001.5501

 

2.6 declare -A 关联数组名[=([字符串下标1]=值1 [字符串下标2]=值2 …… [字符串下标n]=值n)]:定义关联数组

例:定义关联数组b并初始化,然后显示其值: 

purpleEndurer @ bash ~ $ declare -A b=(["apple"]=1 ["boy"]=2 ["cat"]=3)
purpleEndurer @ bash ~ $ echo ${b[*]}
3 1 2

关于关联数组的更多知识,可以回顾:

Linux shell编程学习笔记16:bash中的关联数组icon-default.png?t=N7T8https://blog.csdn.net/Purpleendurer/article/details/134053506?spm=1001.2014.3001.5501

2.7 declare -f[ 函数名]:显示指定的用户自定义函数名称和定义

例:定义函数a和b,然后用 declare -f命令查看它们的名称和定义代码

purpleEndurer @ bash ~ $ function a(){ echo $0;}
purpleEndurer @ bash ~ $ a
bash
purpleEndurer @ bash ~ $ function b(){ echo $#;}
purpleEndurer @ bash ~ $ b
0
purpleEndurer @ bash ~ $ declare -f
a () 

    echo $0
}
b () 

    echo $#
}
purpleEndurer @ bash ~ $ declare -f a
a () 

    echo $0
}
purpleEndurer @ bash ~ $ declare -f b
b () 

    echo $#
}
purpleEndurer @ bash ~ $ 

 

如果在使用declare -f 命令时没有指定函数名,将显示所有的函数名和定义代码。

2.8  declare -F[ 函数名]:显示指定的用户自定义函数名称

例:我们用 declare -F命令查看2.7中例子自定义函数a和b的名称

purpleEndurer @ bash ~ $ declare -F
declare -f a
declare -f b
purpleEndurer @ bash ~ $ declare -F a
a
purpleEndurer @ bash ~ $ declare -F b
b
purpleEndurer @ bash ~ $ 

与 declare -f 命令相似,如果在使用declare -F 命令时没有指定函数名,将显示所有的函数名。

3 declare命令与set命令在显示shell变量功能上的对比

set     :显示用户的局部变量和用户环境变量。

declare: 跟set一样,显示用户的shell变量 (局部变量和环境变量)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1281756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【蓝桥杯选拔赛真题73】Scratch烟花特效 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch烟花特效 一、题目要求 编程实现 二、案例分析 1、角色分析

C#,数值计算——插值和外推,二维三次样条插值(Spline2D_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 二维三次样条插值 /// Object for two-dimensional cubic spline interpolation on a matrix.Construct /// with a vector of x1 values, a vector of x2 values, and a ma…

Fisher信息理论与应用

一、概念介绍 Fisher信息量&#xff0c;是一次观测值所能提供的关于未知参数θ的信息量期望值的一种度量。 Fisher信息矩阵&#xff0c;是用利用最大似然函数估计来计算方差矩阵&#xff0c;表示随机变量的一个样本所能提供的关于状态参数在某种意义下的平均信息量。 Fisher…

python 运用pandas 库处理excel 表格数据

文章目录 读取文件查看数据数据选择数据筛选创建新列计算并总结数据分组统计 读取文件 Pandas 是一个强大的数据分析库&#xff0c;它提供了丰富的数据结构和数据分析工具&#xff0c;其中之一是用于读取不同格式文件的 read_* 函数系列。以下是一个简单介绍如何使用 Pandas 读…

qt-C++笔记之组件-分组框QGroupBox

qt-C笔记之组件-分组框QGroupBox code review! 文章目录 qt-C笔记之组件-分组框QGroupBox1.《Qt 6 C开发指南》p752.《Qt 官方文档》3.《Qt 5.12实战》——5.9 分组框控件 1.《Qt 6 C开发指南》p75 2.《Qt 官方文档》 中间段落翻译&#xff1a; 我把示例补充完整&#xff1a; …

CAN 一: CAN基础知识介绍

1、CAN介绍 1.1、什么是CAN? (1)CAN&#xff08;Controller Area Network:控制器局域网&#xff09;&#xff0c;是ISO国际标准化的串行通信协议。为满足汽车产业的“减少线束的数量”、“通过多个LAN&#xff0c;进行大量数据的高速通信”的需求。 (2)CAN总线的发展历史&a…

Apache Flink(六):Apache Flink快速入门 - Flink案例实现

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

最新最全的Postman接口测试: postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…

Java 数组另类用法(字符来当数组下标使用)

一、原因 看力扣的时候发现有位大佬使用字符来当数组下标使用。 class Solution {public int lengthOfLongestSubstring(String s) {int result 0;int[] hash new int[130];int i 0;for(int j 0; j < s.length(); j) {while(hash[s.charAt(j)] > 0) {hash[s.charAt…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(3)路由导航卫士、主页实现

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、sp…

【带头学C++】----- 九、类和对象 ---- 9.2 构造函数

目录 9.2 构造函数 9.2.1 构造函数的概述 9.2.2 构造函数定义方法&#xff08;初始化构造函数&#xff09; 9.2.3 提供构造函数的影响 9.2 构造函数 以下是一些C引入构造函数的原因&#xff1a; 初始化对象&#xff1a;构造函数允许在创建对象时立即初始化该对象的成员变量…

数据挖掘实战-基于word2vec的短文本情感分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

微机原理——并行接口8255学习1

目录 并行接口特点 可编程并行接口芯片8255 8255端口地址 8255的三种工作方式 8255的两种命令&#xff08;方式命令和C端口命令&#xff09; 由用户扩展的并行接口8255的应用 声光报警器接口设计 步进电机控制接口设计 PA端口实现跑马灯 PB端口实现按键输入 并行接口特…

最大乘积分解(动态规划)

相较于我上一题写的动态规划&#xff0c;这一题比较简单 代码如下&#xff1a; #include<stdio.h>int main(void) {long long n, max[101] {0, 1};scanf("%lld", &n);for(int i 1; i < n; i)max[i] i;for(int i 1; i < n; i)for(int j 1; j &…

RT-Thread 汇编分析启动流程

文章目录 一、汇编指令二、启动文件三、流程图 一、汇编指令 这里介绍即几条最常见实用的汇编指令 LDR R0,[R1]&#xff1a;将R1指定内存地址数据&#xff0c;存储到寄存器R0中。STR R0,[R1,#4]&#xff1a;将寄存器R0中数据存储到寄存器R1加上偏移量4的位置。MOV r0,#0x01&a…

read()之后操作系统都干了什么

首先说明三个参数 file文件 buff从内存中开辟一段缓冲区用来接收读取的数据 size表示这个缓冲区的大小 有关file的参数&#xff1a; 状态&#xff1a;被打开 被关闭权限&#xff1a;可读可写最重要的是inode: 他包含了 文件的元数据(比如文件大小 文件类型 文件在访问前需要加…

Matlab和python详解数独谜题问题

&#x1f517; 运行环境&#xff1a;Matlab、Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f4…

c语言调用free,提示已触发了一个断点。

在用c语言写数据结构的链表的时候&#xff0c;执行也没有什么大错&#xff0c;逻辑也是对的&#xff0c;但是一道free函数会自动触发一个断点。如图&#xff1a; 这个断点产生的原因是由于分配的内存太小了在使用的时候没有任何问题&#xff0c;但是在执行程序的时候&#xff0…

JAVA毕业设计113—基于Java+Springboot+Vue的体育馆预约系统(源代码+数据库+12000字论文)

基于JavaSpringbootVue的体育馆预约系统(源代码数据库12000字论文)113 一、系统介绍 本项目前后端分离&#xff0c;本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 注册、登录、场地(查看/预订/收藏/退订)、在线论坛、公告查看、我的预订管理、我的收藏…

[二分查找]LeetCode2040:两个有序数组的第 K 小乘积

本文涉及的基础知识点 二分查找算法合集 题目 给你两个 从小到大排好序 且下标从 0 开始的整数数组 nums1 和 nums2 以及一个整数 k &#xff0c;请你返回第 k &#xff08;从 1 开始编号&#xff09;小的 nums1[i] * nums2[j] 的乘积&#xff0c;其中 0 < i < nums1.…