变量

变量是能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。

变量声明

声明变量一般使用下面方式:

root@iZuf6ilzd4iqvuj4dvuiwtZ:~# var=test #这里声明了一个名为 var 的变量,并给他赋值为test
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# # “=”前后不能有空格,变量名区分大小写

或者下面方式:

root@iZuf6ilzd4iqvuj4dvuiwtZ:~/HtmlDOM/Libs# declare var1=123
root@iZuf6ilzd4iqvuj4dvuiwtZ:~/HtmlDOM/Libs# export var2=234
root@iZuf6ilzd4iqvuj4dvuiwtZ:~/HtmlDOM/Libs#
root@iZuf6ilzd4iqvuj4dvuiwtZ:~/HtmlDOM/Libs# env var3=333

上面使用的命令:declare,export,env 都可以声明变量,区别在于变量作用域不同。
shell有两种变量:

  • shell局部变量
    局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
    通过赋值语句定义好的变量,可以通过如下方法定义shell变量
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~/HtmlDOM/Libs# declare var1=123
    root@iZuf6ilzd4iqvuj4dvuiwtZ:~/HtmlDOM/Libs# var1=123

  • 用户环境变量
    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
    通过export语法导出的shell私有变量,可以通过如下方法导出用户环境变量
    export x =2
    declare -x x=2

变量使用

显示shell变量

  • env 这是一个工具,或者说一个Linux命令,显示用户的环境变量。
  • set 显示用户的局部变量和用户环境变量。
  • export 显示导出成用户变量的shell局部变量,并显示变量的属性;就是显示由局部变量导出成环境变量的那些变量 (比如可以 export WWC导出一个环境变量,也可通过 declare -X LCY导出一个环境变量)
  • declare 跟set一样,显示用户的shell变量 (局部变量和环境变量)

declare命令:

    # 语法:declare [-aAfFgilnrtux] [-p] [name[=value] ...]# 描述: declare 用来声明变量和配置变量的属性,如果declare后面没有参数,将会显示全部变量的属性和值。# 参数-f   限制行动或显示函数名称和定义-F  只限制显示函数名(加上行号和源文件时调试)-g  在shell函数中使用时创建全局变量;否则忽略-p  显示每个变量的属性和值。# 属性设置参数-a  声明一个索引数组-A  声明一个聚合数组-i   变量值为整数,当给变量赋值为非整数值时变量为0-l   给变量赋值时转换成小写字母-n  将名称引用为其值命名的变量。-r   只读变量 # 使用readonly命令也可以设置变量只读-t  使名称具有“trace”属性-u  给变量赋值时转换成大写字母-x  导出变量到用户环境变量

export命令

    # 语法: export [-fn] [name[=value] ...] or export -p# 描述:从shell变量导出属性,将自动导出的每个名称标记为随后执行的命令的环境。如果提供了值,则在导出之前分配值。# 参数-f     引用shell函数-n     从每个变量删除导出属性-p     显示已导出的函数和变量清单

set 命令

    # 语法:set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]# 描述:设置或取消shell参数和位置参数的值。更改shell属性和位置参数的值,或显示shell变量的名称和值。# 参数:-a  标记为导出而修改或创建的变量。-b  立即通知终止任务。-e  如果有非零状态的命令退出,立即退出。-f  禁用文件名称生成(全局)。-h  记住所查找的命令位置。-k 所有的赋值参数都放置在一个命令的环境中,而不仅仅是在命令名前面的命令。-m  开启任务控制。-n  读取命令,但不执行它们。-o option-name设置对应于选项名的变量:allexport    与-a相同braceexpand  与-B相同emacs        使用emacs样式的行编辑界面。errexit      与-e相同errtrace     与-E相同functrace    与-T相同hashall      与-h相同histexpand   与-H相同history      开启命令历史ignoreeof    读取EOF时shell不会退出interactive-comments允许注释出现在交互式命令行中keyword      same as -kmonitor      same as -mnoclobber    same as -Cnoexec       same as -nnoglob       same as -fnolog        目前接受但忽略notify       same as -bnounset      same as -uonecmd       same as -tphysical     same as -Ppipefail     管道的返回值是最后一个以非零状态退出的命令的状态,如果没有非零状态的命令退出,则为零。posix        更改bash的行为,默认操作与Posix标准不同,以匹配标准。privileged   same as -pverbose      same as -vvi           使用vi样式的行编辑界面xtrace       same as -x-p  当真实有效的用户id不匹配时打开。取消对$ENV文件的处理和shell函数的导入。关闭这个选项会导致有效的uid和gid设置为真正的uid和gid。-t  读取和执行一个命令后退出。-u  在替换时将未设置的变量视为一个错误。-v  打印shell的输入行。-x  打印命令及其执行时的参数。-B  shell将执行支撑扩展-C  如果设置,则不允许通过重定向输出来覆盖现有的常规文件。-E  如果设置,ERR捕获是由shell函数继承的。-H  启用!风格历史替换。当shell是交互式的时,这个标志是默认的。-P  如果设置,在执行命令(例如更改当前目录的cd)时,不要解析符号链接。-T  如果设置,DEBUG捕获从shell函数继承--  将剩余的参数分配给位置参数。如果没有剩下的参数,那么位置参数就没有设置。-   将剩余的参数分配给位置参数。-x和-v选项关闭。

env命令

    # 描述: 在修改的环境中运行程序,将每个名称设置为环境中的值并运行命令。对长参数的强制参数也必须是短参数。# 语法: env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]# 参数-i, --ignore-environment从一个空的环境开始。-0, --null用NUL,而不是newline结束每个输出行。-u, --unset=NAME从环境中删除变量。# 如果没有参数则打印当前环境中的变量

变量作用域

shell变量

shell变量相当于一个全局变量,可以在子shell,函数中使用。在函数中直接声明一个变量或者使用declare -g 声明变量,则此变量为全局变量。

如:

# variable=value
# declare variable=value

函数变量

使用local命令可以声明一个函数(局部)变量,此变量只能在函数内访问,如果不适用local命令,则此变量为shell(全局)变量。

function test(){variable=123; # 全局变量declare -g v=2 # 全局变量local a=123 # 函数(局部)变量,只能在函数内访问
}

变量取消

使用unset命令可以删除变量

unset命令

    # 语法: unset [-f] [-v] [-n] [name ...]# 描述: 撤销shell变量和函数的值和属性。对于每个名称,删除相应的变量或函数。# 参数:-f  将name参数视为函数-v  将name参数视为变量-n  每个名称视为一个名称引用,并将变量本身设置为unset。而不是它引用的变量。# 没有选项,unset首先尝试取消设置一个变量,如果失败,则尝试取消设置一个函数。# 注意:只读变量不能被unsetroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# declare -r NAME=raojlroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# unset NAME-bash: unset: NAME: cannot unset: readonly variableroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# 

变量调用

在声明变量一个变量时变量名称要遵守下列规则:

  1. 不能以特殊字符(除了_),数字,美元符($)开头
  2. 变量名不能是纯数字
  3. 变量名可以是英文或数字或特殊字符(_)的组合

调用变量时在变量明前面以$var的形式调用变量,如:

root@iZuf6ilzd4iqvuj4dvuiwtZ:~# name=raojl # 声明一个名为name的变量并赋值为raojl
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo $name # 调用变量name
raojl  # name的值
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# 

变量名可以在双引号""内使用,shell会解释引号内的变量,在''则不会解释变量。如:

root@iZuf6ilzd4iqvuj4dvuiwtZ:~# name=raojl
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo "$name" # shell会解释引号内的变量name
raojl # 变量name的值
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo '$name' # shell不会解释name
$name # 原样输出,不会解释
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# 

也可以使用大括号${variable}的形式将变量包裹起来,为了避免变量名被其他字符干扰,可以使用此方式,如:

root@iZuf6ilzd4iqvuj4dvuiwtZ:~# hello=Hello
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo "$helloWorld" # shell将会解释变量 hellworldroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo "${hello}World" # shell将会解释hello变量
HelloWorld
root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo "$hello World"
Hello World
root@iZuf6ilzd4iqvuj4dvuiwtZ:~#

$符号引入了参数扩展、命令替换或算术扩展。要扩展的参数名称或符号可以用括号括起来,这是可选的,但可以保护变量,使其从可以被解释为名称的一部分的字符中扩展。

参数扩展

       ${parameter}参数的值被替换。当参数是一个超过一个数字的位置参数时,或者在参数后面加上一个不被解释为其名称的部分的字符时,需要使用括号。参数是一个列:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter:-word}使用默认值,如果parameter未定义或值为空则被替换成word,否则为parmeter的值列:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH:-w} #PATH不为空/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PAT:-w} # PAT为空wroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter:=word}给parameter赋值默认值,如果parameter为空或未定义,则将word赋值给parmaeter,否则值不变,parameter的值不变。特殊字符和位置参数不适用列:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PAT:=w}wroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PAT}wroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH:=W}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter:?word}如果parameter未定义或为空,则在输出(标准错误)一个错误word,否则输出parameter的值列:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${P:?ERROR} # P未定义-bash: P: ERRORroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter:+word}使用替代值.  如果parameter 为空或未定义,输出为空,否则输出word列:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${P:+ERROR}root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH:+ERROR}ERRORroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter:offset}${parameter:offset:length}子字符串扩展,从offset位置开始,输出length个字符如果偏移量计算为小于零的数,则该值用作参数值结束时字符的偏移量。如果长度对小于零的数求值,则将其解释为从参数值(而不是多个字符)结束字符的偏移量,而扩展是偏移量与结果之间的字符。注意,一个负偏移量必须与冒号隔开至少一个空间。如果length未指定,则0-offset位置的字符将会被删除如果参数是@,那么结果就是长度位置参数开始偏移。相对于最大的位置参数,一个负偏移量被取走,所以-1的偏移量等于最后一个位置参数。如果长度计算为小于零的数,则为扩展误差。如果参数是由@或*编写的索引数组名,则结果是数组的长度成员以${parameter[offset]}开始。相对于指定数组的最大索引,将使用一个负偏移量。如果长度计算为小于零的数,则为扩展误差。应用于关联数组的子字符串扩展会产生未定义的结果。子字符串索引是从零开始的,除非使用了位置参数,在这种情况下,在默认情况下,索引从1开始。如果偏移量为0,并且使用了位置参数,$0将被预先固定到列表中。列:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH:2}sr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH:2:4}sr/lroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${!prefix*}${!prefix@}变量名匹配,匹配以prefix开头的变量名,输出匹配的变量名列:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${!P*}PAT PATH PIPESTATUS PPID PS1 PS2 PS4 PW PWDroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${!P@}PAT PATH PIPESTATUS PPID PS1 PS2 PS4 PW PWDroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${!name[@]}${!name[*]}数组键的列表。如果名称是一个数组变量,则扩展到名称中指定的数组索引(键)列表。如果名称不是数组,则将其扩展为0,如果名称设置为null,则为null。当使用@时,扩展出现在双引号,每个键扩展到一个单独的单词。例如:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${name[@]}1 2root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${!name[@]}0 2root@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${#parameter}变量长度,如果变量未定义或为空则返回0,如果是一个数组变量则返回数组长度例如:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${#PATH}60root@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter#word}${parameter##word}前缀匹配模式,如果parameter的值以word开头则parameter前的word将会被删除,如果parameter是一个数组变量,形如${parameter[@]#word},则此数组中的每个值将会与word做前缀匹配#word 为最短匹配##word 为最长匹配例如:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH#/usr}/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter%word}${parameter%%word}与${parameter#word}相反,后缀匹配例如:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH%bin}/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/root@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter/pattern/string}模式替换,pttern将被替换成string正常情况下pattern 只有第一个匹配的会陪替换成string如果表达式以#开头,如:#w,则必须匹配以w开头的如果表达式以%几位,如:t%,则必须匹配以t结尾的pattern支持通配符*,如:${PWD/*/s},则变量PWD的值全部被替换成s如果parameter是一个数组变量,则数组中的成员都会执行此操作,返回一个匹配结果数例如:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${PATH/#\/usr/s}s/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# ${parameter^pattern}${parameter^^pattern}${parameter,pattern}${parameter,,pattern}大小写转换.^ 操作将pattern的匹配结果转换成大写字母,第一个字符, 操作将pattern的匹配结果转换成小写字母,第一个字符^^ 操作将pattern的匹配结果转换成大写字母,, 操作将pattern的匹配寄过转换成小写字母如果parameter是一个数组变量,则数组中的每个成员将会与pattern做匹配通配符:* 在^^和,,操作中表示0个或多个字符,在^和,中表示一个或0个字符? 与*相同例如:root@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${TERM,*} xtermroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${TERM^*} Xtermroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${TERM^^*} XTERMroot@iZuf6ilzd4iqvuj4dvuiwtZ:~# echo ${TERM,,*} xtermroot@iZuf6ilzd4iqvuj4dvuiwtZ:~#

参考资料

  • Linux中 set、env、declare、export显示shell变量的区别

转载于:https://blog.51cto.com/jlnetc/2104214

Linux shell 编程(四):变量相关推荐

  1. linux实验三shell程序设计,实验三 LINUX SHELL编程

    精选文库 -实验三LINUX SHELL 编程 四.实验内容 本实验包含两个具体的SHELL程序编写任务,较为全面地涉及了SHELL 程序的设计方法和技术.内容如下: 1.创建以下菜单程序: USER ...

  2. linux系统——Shell编程之变量解释

    linux系统--Shell编程之变量解释 - Shell能做什么 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略-) 自动化批量软件部署程序 (LAMP,LNMP,Tomca ...

  3. Linux学习——shell编程之变量

    shell编程之变量:Linux shell编程基础中的变量. 包括Bash变量的分类和各变量的详细使用,如:用户自定义变量.环境变量.语系变量.位置参数变量和预定义变量. 1:什么是Bash变量? ...

  4. Linux Shell 编程学习总结

    Shell 教程 Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成 ...

  5. Linux Shell中的变量-环境变量

    参考:<Linux命令 / 编辑器与Shell编程> ################################################ note that :与其他编程语言 ...

  6. shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)

    一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...

  7. linux怎么退出shell编程,Linux Shell编程(11)——退出和退出状态

    exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程. 每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零 ...

  8. 「Linux」Linux Shell 编程基础入门

    Linux Shell 编程基础入门 1. 变量 1.1 变量定义 1.2 使用变量 1.3 引号 1.4 将命令的结果赋值给变量 1.5 位置参数 1.6 特殊变量及其含义 2. 字符串 2.1 字 ...

  9. Shell编程四剑客之AWK(基础篇)

    Shell 编程四剑客之 AWK 概述 其语法参数格式为,AWK 常用参数.变量.函数详解如下: (1) AWK 基本语法参数详解: (2) AWK 内置变量详解: (3) AWK 内置函数详解: ( ...

  10. Linux Shell编程

    Linux Shell编程 一.简述       简单的介绍shell脚本的基本用法.      shell脚本是 由一些按照一定格式组合起来的shell命令 组成.shell脚本不需要编译就可以直接 ...

最新文章

  1. python dictwriter_手把手教你写爬虫 |Python 采集大众点评数据采集实战
  2. 过年了,是不是应该写点代码祝福别人
  3. SAP License:赛锐信息访谈启示录(二)
  4. python创建txt文件_Mac怎么创建txt文件?教你设置新建txt的快捷键
  5. Total Commander 使用技巧
  6. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第4节 等待唤醒机制_3_等待唤醒案例代码实现...
  7. 网络蜘蛛及搜索引擎基本原理
  8. 由三个点坐标判断三个点能否组成三角形模板(自用,客官可取)
  9. MongoDB文件服务器搭建
  10. 逆向——微信接收文本图片消息
  11. 订单管理html页面,订单管理.html
  12. auto.ja 部落冲突01 找图并点击
  13. Nature破解癌王生长关键:真菌由肠道入侵胰腺,定植增加3000倍,富集Malassezia菌...
  14. CN基于词库的中文转拼音优质解决方案,单类单文件版,支持低版本PHP
  15. 使用Jmeter对华为私有云进行性能测试
  16. 英语语法笔记——并列句(二)
  17. ClickHouse MergeTree副本表和分布式表(切片)
  18. webstorm安装及汉化后无法设置的原因总结
  19. Mosquitto安装及使用
  20. 虚拟机安装(详细教程)

热门文章

  1. step6: item与pipeline
  2. Java基础 -- 冒泡排序算法(带详细注释)
  3. 如何给100亿个数字排序
  4. python基础学习1-字典的使用
  5. js charCodeAt() charAt()
  6. Liunx之chown命令
  7. cin.get()和cin.getline()区别
  8. (二十六)java版spring cloud+spring boot 社交电子商务平台-Eureka介绍
  9. 搭建Vue2.0脚手架(vue-cli)
  10. html/jsp下载Excel文件