环境变量                    

环境变量就是运行在"环境"上下文的,在这个上下文都可以引用。例如,常见的cd、ls等命令严格来说应该使用绝对路径如/bin/ls来执行,由于/bin目录加入到了PATH环境变量中,系统自己会去寻找PATH下的路径是否有该命令。

环境变量常用大写字母表示。常见的环境变量有HOSTNAME、SHELL、HISTSIZE、USER、PATH、PWD、LANG、HOME、LOGNAME。分别表示当前主机名、SHELL的路径即bash的类型、history保存多少记录、当前用户名、自动搜索路径、当前目录、使用的语系(临时修改语系时就改这个变量)、当前用户的家目录、当前登录的用户。

使用env或者export可以查看当前用户的环境变量。

  1. [root@localhost ~]# env
  2. HOSTNAME=localhost.localdomain
  3. TERM=vt100
  4. SHELL=/bin/bash
  5. HISTSIZE=
  6. SSH_CLIENT=192.168.1.5
  7. QTDIR=/usr/lib64/qt-3.3
  8. QTINC=/usr/lib64/qt-3.3/include
  9. SSH_TTY=/dev/pts/
  10. USER=root
  11. LS_COLORS=rs=:di=;:ln=;:mh=:pi=;:so=;:do=;:bd=;;:cd=;;:or=;;:mi=;;;:su=;:sg=;:ca=;:tw=;:ow=;:st=;:ex=;:*.tar=;:*.tgz=;:*.arj=;:*.taz=;:*.lzh=;:*.lzma=;:*.tlz=;:*.txz=;:*.zip=;:*.z=;:*.Z=;:*.dz=;:*.gz=;:*.lz=;:*.xz=;:*.bz2=;:*.tbz=;:*.tbz2=;:*.bz=;:*.tz=;:*.deb=;:*.rpm=;:*.jar=;:*.rar=;:*.ace=;:*.zoo=;:*.cpio=;:*.7z=;:*.rz=;:*.jpg=;:*.jpeg=;:*.gif=;:*.bmp=;:*.pbm=;:*.pgm=;:*.ppm=;:*.tga=;:*.xbm=;:*.xpm=;:*.tif=;:*.tiff=;:*.png=;:*.svg=;:*.svgz=;:*.mng=;:*.pcx=;:*.mov=;:*.mpg=;:*.mpeg=;:*.m2v=;:*.mkv=;:*.ogm=;:*.mp4=;:*.m4v=;:*.mp4v=;:*.vob=;:*.qt=;:*.nuv=;:*.wmv=;:*.asf=;:*.rm=;:*.rmvb=;:*.flc=;:*.avi=;:*.fli=;:*.flv=;:*.gl=;:*.dl=;:*.xcf=;:*.xwd=;:*.yuv=;:*.cgm=;:*.emf=;:*.axv=;:*.anx=;:*.ogv=;:*.ogx=;:*.aac=;:*.au=;:*.flac=;:*.mid=;:*.midi=;:*.mka=;:*.mp3=;:*.mpc=;:*.ogg=;:*.ra=;:*.wav=;:*.axa=;:*.oga=;:*.spx=;:*.xspf=;:
  12. MAIL=/var/spool/mail/root
  13. PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  14. PWD=/root
  15. LANG=zh_CN.UTF-
  16. HISTCONTROL=ignoredups
  17. SHLVL=
  18. HOME=/root
  19. LOGNAME=root
  20. QTLIB=/usr/lib64/qt-3.3/lib
  21. CVS_RSH=ssh
  22. SSH_CONNECTION=192.168.1.5 192.168.1.213
  23. LESSOPEN=||/usr/bin/lesspipe.sh %s
  24. G_BROKEN_FILENAMES=
  25. _=/bin/env

使用echo可以输出变量的值。

  1. [root@localhost ~]# echo $PATH
  2. /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

例如,在PATH环境变量中新加入一个目录/usr/local/mysql/bin。

  1. [root@localhost ~]# PATH=/usr/local/mysql/bin:$PATH
  2. [root@localhost ~]# echo $PATH
  3. /usr/local/mysql/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

这里也能看到两个PATH第一个没使用$,第二个使用了。当对变量本身进行操作,则不使用$,当对变量值进行操作,则使用$

普通变量                            

脚本语言是弱类型的语言,变量通常不需要特地声明甚至不需要初始化,在脚本运行时由解释器进行解释运算,解释器知道变量在什么时候是什么类型,所以直接赋值使用即可。bash中,变量默认都是字符串类型,不论是否使用引号赋值,都以字符串方式存储。

1.变量赋值方式: str=value 。注意等号左右没有空格。如果有空格就是进行比较运算符的比较运算了。

2.变量引用方式:$str或者${str},例如 echo "the var is ${str}" 。

  1. [root@localhost ~]# str='Hello World!'
  2. [root@localhost ~]# echo "We will say ${str}"
  3. We will say Hello World!

释放变量: unset str ,注意变量名前不加前缀$。

  1. [root@localhost ~]# unset str

查看所有的变量:不接任何参数的set或者declare命令,输出结果中包含了普通变量和环境变量。

定义只读变量: readonly str 。这时将无法修改变量值也无法unset变量,只有重新登录shell才能继续使用只读变量。

临时将普通变量升级为环境变量: export str 或者赋值时 export str="value" ,这样$str就可以在当前shell和子shell中使用,但是退出脚本或者重新登录shell都会取消export效果。

  1. [root@localhost ~]# str='Hello World!';echo $str
  2. Hello World!
  3. [root@localhost ~]# bash
  4. [root@localhost ~]# echo ${str}
  5.  
  6. [root@localhost ~]#

在子shell中查看变量,结果竟然没有该变量。这是因为$str的作用域只在当前shell,要想在子shell中也能引用普通变量,则需要使用export升级为环境变量。

  1. [root@localhost ~]# exit
  2. exit
  3. [root@localhost ~]# echo $str
  4. Hello World!
  5. [root@localhost ~]# export str
  6. [root@localhost ~]# echo $str
  7. Hello World!

修改变量的生命周期和作用域                      

普通的变量在脚本结束或退出登录后就失效,并且只对当前shell有效,其他用户和当前用户的子shell都无法使用。

使用export可以升级为临时局部的环境变量,只对当前用户的当前shell和子shell有效,退出脚本和退出登录后也失效。

如果想要设置永久的且全局的变量,一种方法是将变量的设置语句放入到/etc/profile文件中,因为每个用户登录时,都会调用该文件并执行其中的语句。如果想立即加载此文件中的配置使得临时添加的设置立即生效,只需source该文件即可。

  1. [root@localhost ~]# source /etc/profile
  2. [root@localhost ~]#

/etc/profile文件是bash的全局配置文件,还有每个用户的配置文件~/.bash_profile,此文件中的变量将只对对应的用户生效。

此外,还有几个配置bash环境配置文件,具体的见bash环境配置流程

获取变量的长度                            

在使用"${}"方式引用变量时,变量名前加上#就可以查看该变量的字符长度。空格也算入长度。例如:

  1. [root@localhost ~]# echo ${#str}
  2.  
  3. [root@localhost ~]# echo ${#PATH}

declare声明变量                            

  1. declare [+/-][选项] 变量名
  2.  
  3. 选项说明:
  4.  
  5. -/+:给变量设定类型属性,取消给变量设定的类型属性
  6.  
  7. -i:声明为整型
  8.  
  9. -x:声明为环境变量
  10.  
  11. -p:显示变量名和值

例如,声明一个环境变量 declare -x str ,取消该变量 declare +x str

位置变量和特殊变量                        

  1. $?:上一条代码执行的回传指令,回传0表示标准输出,即正确执行,否则为标准错误输出。
  2.  
  3. $$:当前shellPID。除了执行bash命令和shell脚本时,$$不会继承父shell的值,其他类型的子shell都继承。
  4.  
  5. $BASHPID:当前shellPID,这和"$$"是不同的,因为每个shell$BASHPID是独立的。而"$$"有时候会继承父shell的值。
  6.  
  7. $!:最近一次执行的后台进程PID
  8.  
  9. $#:统计参数的个数。
  10.  
  11. $@:所有单个参数,如"a""b""c""d"
  12.  
  13. $*:所有参数的整体,如“abcd”。
  14.  
  15. $:脚本名。
  16.  
  17. $……$n:参数位置。

使用下面的脚本来验证位置变量和特殊变量。

  1. [root@localhost ~]# cat var.sh
  2. #!/bin/bash
  3.  
  4. # 测试各种变量的作用,包括预定义和自定义变量
  5. echo '$?:'$?
  6. echo '$$:'$$
  7. echo '$!:'$!
  8. echo '$#:'$#
  9. echo '$@:'$@
  10. echo '$*:'$*
  11. echo '$0:'$
  12. echo '$1:'$
  13. echo '$2:'$
  14. echo '$3:'$
  15. echo '$4:'$
  16. [root@localhost ~]# bash var.sh a b c d e
  17. $?:
  18. $$:
  19. $!:
  20. $#:
  21. $@:a b c d e
  22. $*:a b c d e
  23. $:var.sh
  24. $:a
  25. $:b
  26. $:c
  27. $:d

shift轮替变量                            

使用 shift [N] 可以指定参数轮替,每执行一次 shift N 就踢掉N个参数,默认N为1。

例如在脚本中:

  1. echo $ # # 输出第一个参数值
  2. shift # # 踢掉前两个参数,第三个参数变成$
  3. echo $ # # 此时$1的值为第三个参数的值
  4. shift # # 又踢掉一个参数,第四个参数变成$
  5. echo $ # # 输出第四个参数

shell其他基础                            

变量中字符的长度: ${#VARNAME}

变量赋值等:

  1. ${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则展开为parameter的值;
  2.  
  3. ${parameter-word}:和${parameter:-word}几乎等价,除了parameter设置了但为空时,变量的结果将是null,而非word。在/etc/init.d/httpd中有此用法。
  4.  
  5. ${parameter:+word}:如果parameter为空或未定义,不做任何操作,即仍然为空;否则展开为“word”值;
  6.  
  7. ${parameter:=word}:如果parameter为空或未定义,则变量赋值(注意是赋值,不是展开)为“word”,否则为parameter自身;
  8.  
  9. ${parameter=word}:在man bash里没有该定义,但是经测试,等价于${para:=word}。
  10.  
  11. ${parameter:offset}:取子串,从offset处的后一个字符开始取到最后一个字符;
  12.  
  13. ${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;

其中 ${parameter:-word} 最常用,最后两个是截取字符串的,偶尔也会用到。

脚本配置文件

配置文件中的变量值可以在脚本中被使用

要在脚本中调用配置文件,直接使用 source config_file 或 . config_file

服务启动脚本支持配置文件:/etc/sysconfig/服务脚本同名的配置文件

局部变量,在函数中定义局部变量使其不影响函数外的同名变量

  1. local VAR_NAME=

命令mktemp创建临时文件或目录

  1. mktemp [-d] /tmp/file.XX # X指定越多,随机生成的后缀就越长,其中-d表示创建临时目录。

例如:

  1. [root@localhost ~]# mktemp haha.XXX
  2. haha.0Or
  3. [root@localhost ~]# mktemp -d haha.XXX
  4. haha.AiW

变量的切分、提取和替换                      

其实是对变量实现的功能,只是使用文件名的说法比较典型,且容易理解它的用途。

例如,将文件名"Linux.docx.jpg"存放到变量file_name中,然后执行从左向右或从右向左的删除或贪婪删除。

  1. [root@localhost ~]# file_name="Linux.docx.jpg"
  2. [root@localhost ~]# file_name_greedy=${file_name%%.*}
  3. [root@localhost ~]# file_name_nongreedy=${file_name%.*}
  4. [root@localhost ~]# extention_name_greedy=${file_name##*.}
  5. [root@localhost ~]# extention_name_nongreedy=${file_name#*.}
  6. [root@localhost ~]# echo -e "${file_name_greedy}\n${file_name_nongreedy}\n${extention_name_greedy}\n${extention_name_nongreedy}"
  7. Linux
  8. Linux.docx
  9. jpg
  10. docx.jpg

${var%%.*} 和 ${var%.*} 中的 %%.* 表示从右向左匹配 .* 并删除,由于Linux.docx.jpg有两种符合条件的匹配:".jpg"和".docx.jpg",所以使用两个"%%"表示贪婪删除,即删除最长匹配".docx.jpg"。可以使用一个%表示非贪婪删除,表示删除最短的匹配即".jpg"。

${var##*.} 和 ${var#*.} 中的 ##*. 表示从左向右匹配 *. 并执行贪婪删除,即删除"Linux.docx.",同理 #*. 表示非贪婪删除,即删除"Linux."。

除了删除,还可以实现提取和替换的功能。

  1. [root@localhost ~]# echo "${file_name:0:5}"     
  2. Linux
  3. [root@localhost ~]# echo "${file_name:6:4}"
  4. docx
  5. [root@localhost ~]# echo "${file_name/jpg/pdf}"
  6. Linux.docx.pdf
  7. [root@localhost ~]# echo "${file_name//jpg/pdf}"
  8. Linux.docx.pdf

不错的功能是替换。有时候想要删除PATH环境变量中的某个路径,可以使用变量替换的功能,似乎没法使用变量切分来实现。例如:

  1. [root@localhost ~]# echo $PATH
  2. /usr/local/mysql/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

注意,由于可能多次读取了配置文件,导致PATH中出现了重复的路径。现在想删除其中一个路径。使用下面的命令就可以实现路径删除,注意其中使用了转义符号,并且变量替换的替换值留空了表示删除前面匹配的部分。

  1. [root@localhost ~]# PATH=${PATH/:\/usr\/local\/mysql\/bin/}
  2. [root@localhost ~]# echo $PATH
  3. /usr/local/mysql/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

SHELL脚本--变量的更多相关文章

  1. shell脚本变量

    既然是变量,自然分变量名和变量值,在使用的时候一定要注意哪些地方需要用变量名,哪些地方需要用变量的值. 自定义变量 shell变量不需要声明,随用随定义,给变量赋值的时候要注意 shell是空格敏感的 ...

  2. SHELL脚本--变量(基础)

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 变量存在于内存中.假设变量str,设置或修改变量属性时,不带$ ...

  3. shell脚本--变量与数组

    Linux中的变量有环境变量和用户自定义变量,关于环境变量,可以查看这篇博客:linux环境变量 本文主要针对的是用户在shell脚本中定义的变量,但是环境变量也可以在shell脚本中使用. 普通变量 ...

  4. shell脚本变量$#,$*,$$,$@,$0,$1,$2,$?的含义

    本文转录:https://blog.csdn.net/kejiaming/article/details/51859503 参数说明: $# 是传给脚本的参数个数 $ 是脚本本身的名字 $ 是传递给该 ...

  5. shell脚本变量定义注意别跟系统变量重名了……

    写了个很简单的脚本,执行结果却很奇怪.   1 #!/bin/bash PATH=$HOME/vlc_transplant4 rm -f $PATH/vlc ln -s $PATH/bin/vlc-s ...

  6. Shell脚本变量与判断

    变量 环境变量 局部变量 declare 定义变量类型 本地变量 local 在函数中使用 变量类型: 数值型: 1.整形 2.浮点型 3.布尔型 0 1 (真 假) (true false) 字符串 ...

  7. shell脚本变量的参数

    https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables mkdir f ...

  8. shell 脚本 变量使用,取消一个变量,echo

    1. 用户自定义变量,直接使用,赋值的时候等号两边不能有空格 A=100 echo "\$A = $A" # $是取变量A 中的值 "" 号中 \$ 是转译,此 ...

  9. 《Linux命令行与shell脚本编程大全》 第六章环境变量

    很多程序和脚本都通过环境变量来获取系统信息.存储临时数据和配置信息. 6.1 什么是环境变量: bash shell用一个叫环境变量(environment variable)的特性来存储有关shel ...

随机推荐

  1. angular 使用ng-zorro的from组件 运行报错

    emplate parse errors: Can't bind to 'formGroup' since it isn't a known property of 'form'. 原因:没有导入表单 ...

  2. EM-高斯混合模型

    EM-高斯混合模型 认识 前面为了直观认识 EM 算法, 用的"扔硬币"的案例, 是为了简化和直观, 而稍微偏应用和深入一点是高斯模型分类,这样一个话题. 就好比我们现在有一堆的数 ...

  3. ESP8266 LUA脚本语言开发: 外设篇-GPIO中断检测

    https://nodemcu.readthedocs.io/en/master/modules/gpio/#gpiomode 测试引脚 GPIO0 gpio.mode(,gpio.INT) func ...

  4. Paper | Residual Dense Network for Image Super-Resolution

    目录 Residual dense block & network 和DenseNet的不同 摘要和结论 发表在2018年CVPR. 摘要和结论都在强调方法的优势.我们还是先从RDN的结构看起 ...

  5. golang实战--家庭收支记账软件(面向过程)

    1.开发流程 2.目标 模拟实现一个基于文本界面的(家庭记账软件) : 初步掌握编程技巧和调试技巧: 主要包含以下知识点:局部变量和基本数据类型.循环语句.分支语句.简单屏幕格式输出.面向对象编程: ...

  6. LeetCode 231.2的幂

    LeetCode 231.2的幂 题目: 给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 算法: 若一个数是2的幂次的话定会有n & (n - 1) == 0这个关系成立 所以直接用 ...

  7. ASP.NET Core快速入门(第2章:配置管理)--学习笔记

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务9:配置介绍 命令行配置 Json文件配置 从配置文件文本到c#对象实例的 ...

  8. WPF控件模板(6)

    什么是ControlTemplate? ControlTemplate(控件模板)不仅是用于来定义控件的外观.样式, 还可通过控件模板的触发器(ControlTemplate.Triggers)修改控 ...

  9. Linux帮助——获取帮助

    Linux帮助——获取帮助 摘要:本文主要学习了Linux众多命令中最基础的帮助命令. 介绍 作用 Linux的所有操作都可以通过命令行来完成,所以学习Linux最好从命令行开始.因为Linux的命令 ...

  10. java 的11个特性

    以下11个特性来自于著名的"java白皮书"中,博主会针对这些特性一一进行粗略的解释.相信看完博主的这篇文章,以后在和小伙伴们吹牛逼,可就有了切实可靠的理论依据了. 11个特性分别 ...