shell编程:shell变量的核心基础知识与实战(二)
https://www.cnblogs.com/luoahong/articles/9152039.html

Shell 变量类型

变量可以分为两类:环境变量(全局变量)和普通变量(局部变量) 
  环境变量也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程shell中使用,环境变量又可分为自定义环境变量和Bash内置的环境变量 
  普通变量也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的

环境变量

    环境变量一般用于定义Shell的运行环境,保证Shell命令的正确执行,Shell通过环境变量来确定登录用户、命令路径、终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程,这包括编辑器,Shell脚本和各类应用(crond任务必须比较特殊)
环境变量可以在命令行中设置创建,但用户退出命令行时这些变量值就会丢失,因此,如果希望永久保存环境变量,可在用户家目录下的.bash_profile或.bashrc文件中或全局配置/etc/bashrc/或/etc/profile 文件或者/etc/profile.d中定义。将环境变量放入上述的文件中,每次用户登录时这些变量值都将被初始化一次
有一些环境变,比如HOME、PATH、UID、USER等,在用户登陆之前就已经被/bin/login 程序设置好了。通常环境变量定义保存在用户家目录下的.bash_profile文件或者全局的配置文件/etc/profile中。

查看系统变量

env命令只显示全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@adminset ~]# env
XDG_SESSION_ID=2
HOSTNAME=adminset
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.118.30 50050 22
SSH_TTY=/dev/pts/0
USER=root
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;31:*.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=01;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=01;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:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.118.30 50050 192.168.118.59 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
OLDPWD=/root/tools

set输出所有的变量,包括全局变量和局部变量

1
2
3
4
5
6
7
8
9
10
11
[root@adminset ~]# set -o |head
allexport       off
braceexpand     on
emacs           on
errexit         off
errtrace        off
functrace       off
hashall         on
histexpand      on
history         on
ignoreeof       off

declare输出所有的变量、函数、整数和已经到处的变量,替代早期的typsest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[root@adminset ~]# declare
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(1)-release'
COLUMNS=124
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=adminset
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=en_US.UTF-8
LESSOPEN=
LINES=12
LOGNAME=root
LS_COLORS=rs=0:di=01
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root/tools
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="1")
PPID=2749
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/root
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SITE=()
SSH_CLIENT='192.168.118.30 50050 22'
SSH_CONNECTION='192.168.118.30 50050 192.168.118.59 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
")[37]="http://10.0.20.127:8091/health/health
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=2
_=on
colors=/root/.dircolors

自定义环境变量

设置环境变量   

如果想设置环境变量,就要给在变量赋值之后或设置变量时使用export命令。带-x选项的declare内置命令也可完成同样的功能。 
格式:

1
2
3
4
5
6
7
8
1.export变量名=value
2.变量名=value;export 变量名
3.declare -x 变量名=value
提示:以上为三种设置环境变量的方法
例:
export NAME=oldboy
declare -x NAME=oldboy
NAME=oldboy;export NAME

让环境变量永久生效的常用设置文件及区别

1、用户的变量变量配置:

1
2
3
4
5
[root@www ~]# ls /root/.bashrc
/root/.bashrc
[root@www ~]# ls /root/.bash_profile
/root/.bash_profile
提示:用户的环境变量设置常见的为用户家目录下的.bashrc和.bash_profile

2、全局环境变量的配置   

全局环境的配置文件常见的配置文件为

1
2
3
/etc/profile
/etc/bashrc
/etc/profile.d

需要登陆后初始化或显示加载内容可以把脚本文件放在/etc/profile.d下,设置可执行即可

3、生产环境 自定义JAVA环境配置实例

环境变量初始化与对应文件的生效顺序

1、通过系统用户登录后默认运行的shell
2、非登录交互式运行shell
3、执行脚本运行非交互式shell

环境变量知识小结:

1、变量名通常要大写 
2、变量可以在自身的shell以及子shell中使用。 
3、通过export来定义环境变量 
4、输出用$变量名,取消用unset变量名 
5、书写定时任务要注意环境变量,最好在执行的shell脚本中重新定义。 
6、如果系统永久生效可以放在用户环境变量文件或全局环境变量文件里。

 

普通变量

 

定义本地变量

本地变量在用户当前的Shell生存期的脚本中使用。例如,本地变量OLDBOY取值为bingbing,这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,本地变量值将无效

1. 普通变量定义

  1. 变量名=value #<==赋值时不加引号
  2. 变量名='value' #<==赋值时加单引号
  3. 变量名="value" #<==赋值时加双引号

2.Shell中定义变量名及给变量内容赋值的要求

变量名一般是由字母数字下划线组成,可以字母或下划线开头

  1. abc,abc123,abc_123

变量的内容可以使用单引号或双引号引起来,也可不加引号,但是这三者是不同的。

3. 普通变量定义及输出的不同例子

1
2
3
4
5
6
7
8
9
[root@luoahong ~]# a=1
[root@luoahong ~]# b='2'
[root@luoahong ~]# c="3"
[root@luoahong ~]# echo "$a"
1
[root@luoahong ~]# echo "$b"
2
[root@luoahong ~]# echo "${c}"
3

提示:$变量名表示输出变量,可以用$c${c}两种用法 
小结:连续普通字符串内容赋值给变量,不管用什么引号或者不用引号,它的内容是什么,打印变量就输出什么

4.例子2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@luoahong scripts]# a=192.168.1.2
[root@luoahong scripts]# b='192.168.1.2'
[root@luoahong scripts]# c="192.168.1.2"
[root@luoahong scripts]# echo "a=$a"
a=192.168.1.2
[root@luoahong scripts]# echo "b=$b"
b=192.168.1.2
[root@luoahong scripts]# echo "c=${c}"
c=192.168.1.2
============================================
[root@luoahong scripts]# a=192.168.1.2-$a
[root@luoahong scripts]# b='192.168.1.2-$a'
[root@luoahong scripts]# c="192.168.1.2-$a"
[root@luoahong scripts]# echo "a=$a"
a=192.168.1.2-192.168.1.2
[root@luoahong scripts]# echo "b=$b"
b=192.168.1.2-$a
[root@luoahong scripts]# echo "c=${c}"
c=192.168.1.2-192.168.1.2-192.168.1.2

小结:数字内容变量定义可不加引号,其他没有特别要求的字符串等定义最好都加上双引号,确实真的需要原因输出的的就加单引号。

5. 把一个命令的结果作为变量的定义方法

  1. 获取命令结果的变量内容写法常见的有两种:
  2. 变量名=`ls` #<==命令用反引号引起来
  3. 变量名=$(ls) #<==命令用$()括起来

变量第一及输出说明

单引号、双引号、反引号与不加引号的知识说明

awk调用shell变量的特殊用法

自定义普通字符串变量

(1)内容是纯数字,简单连续字符(内容中不带任何空格)此时定义方式可以不加任何引号

1
2
a.OldboyAge=33
b.NETWORD=yes 

(2)没特殊情况时,字符串一律用双引号定义,特别是多个字符串中间由空格时

1
2
a.NFS_MODULE="no load"
b.MyName="Good game"

(3)当变量里内容需要原样输出时,要用单引号'',这样的需求极少

1
a.HOST_NAME='OCALHOST'

提示: 
1、变量名只能为字母、数字、下划线,只能以字母或下划线开头 
2、规范的命令名写法要见名如意。

  1. OldboyAge=1 #每个单词的首字母大写
  2. oldboy_age=1 #单词之间用“_”
  3. oldboyAgeSex=1 #驼峰语法:首个单词的首字母小写,其余单词首字母大写
  4. OLDBOY=1 #单词全大写

1.3 变量定义的完整小结:

(1)普通变量内容的定义:

  1. 连续的数字或字符串,可以不加引号,例如a=123
  2. 变量内容很多,还希望解析变量,就加双引号,例如a="/etc/rc.local $USER",会对内容中的USER解析输出
  3. 希望原样输出就用单引号,例如:a='$USER'

(2)希望编译内容是命令得解析结果的定义:

  1. 1.反引号括起来,例如:a=`ls`
  2. 2.或者$()括起来,例如:a=$(ls)

(3)变量的输出方法:

使用$变量名输出变量内容,常用echo $变量名

变量定义的小结技巧:

可以多学习和模仿操作系统自带的/etc/init.d/functions 函数库脚本的定义思路,
多学习linux系统脚本中的定义,有经验的读者最终应形成一套适合自己的规范和习惯

1、变量名及变量内容定义小结

变量名只能为字母、数字或下划线,只能以字母或下划线开头
变量名的定义有一定的规范,并且要见名知意。

1
2
3
4
oldboyAge=1
oldboy_age=1
oldboyAgeSex=1
OLDBOYAGE=1

一般的变量定义,赋值常用双引号;简单连续的字符串可以不加引号;希望原样输出时使用单引号
希望变量的内容是命令的解析结果时,要用反引号``,或者$()把命令括起来再赋值

2、shell定义变量时使用"="的知识

a=1里的等号时复制的意思;比较变量是否相等时也可以用"="或"=="

3、打印输出及使用变量的知识

打印输出或使用变量时,变量名前要接$符号;变量名后面紧接其他字符的时候,要用大括号将变量部分单独括起来,以防止出现"金庸新著"的问题,在unset、export、(())等场景中使用单不打印变量时

不加$,这个有些例外

打印输出或使用变量时,一般加双引号或不加引号;如果实字符串变量,最好加双引号;希望原样输出时使用单引号

作者:罗阿红 出处:http://www.cnblogs.com/luoahong/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

[转帖]shell编程:shell变量的核心基础知识与实战(二)的更多相关文章

  1. SHELL (2) —— Shell变量的核心基础知识和实践

    摘自:Oldboy Linux运维——SHELL编程实战 Shell变量:用一个固定的字符串(也可能是字符.数字等的组合)代替更多.更复杂的内容,该内容里可能还会包含变量.路径.字符串等其它的内容. ...

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

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

  3. SHELL编程概念&变量剖析

    一.shell软件概念和应用场景 1) 学习Linux技术,不是为了学习系统安装.命令操作.用户权限.配置IP.网络管理,学习Linux技术重点:基于Linux系统部署和维护各种应用软件.程序(Apa ...

  4. Linux —— Shell编程之变量赋值和引用

    Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量.有三种主要的变量类型:环境变量.内部变量和用户变量. 环境变量(environment variable)是系统环境的一部分, ...

  5. Linux编程 21 shell编程(环境变量,用户变量,命令替换)

    一.概述 这篇介绍shell的变量使用,跟其实语言一样,都有声明变量,使用变量,在shell中变量允许你临时地将信息存储中shell脚本中,以便和脚本的其他命令一起使用. 1.1 环境变量 在前面章节 ...

  6. Shell编程-02-Shell变量

    目录 什么是Shell变量 变量类型 环境变量初始化及其对应文件的生效顺序 什么是Shell变量     在初等数学数学方程式中,我们会经常碰到类似于这样的方程式:y=x+1 ,等号左右两边的x和y称 ...

  7. Linux Shell编程、变量、控制语句

    为什么要学习Shell编程 1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理. 2)对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些 ...

  8. linux shell编程之变量和bash配置文件(第一篇)

    编程语言有两类 强类型:如C语言.数据具有其特定的类型,先声明定义后才能使用.数据运算时必须符合类型要求(如不能把字符串类型数据直接与整型数据做算数运算) 弱类型:如shell.数据默认为字符型,不用 ...

  9. shell编程之变量

    变量: 变量由字母.数字._ 组成,不能以数字开头 长度不能超过255个字符 在bash中,变量的默认类型是字符串类型 变量分类: 1.用户自定义变量:只在当前shell生效,是局部变量 定义方法: ...

  10. Shell 编程 (变量和条件测试)

    变量: 1 . 变量声明 直接使用变量 + 赋值 #!/bin/bash NAME='HELLO WORD' echo $NAME 使用 declare 关键字声明 declare(选项)(参数) + ...

随机推荐

  1. IDEA美化教程

    一.IDEA 字体大小怎么设置(图文教程) IDEA 初次安装时,默认字体非常小,这种情况下,代码阅读起来非常费劲,对保护视力非常不友好.那么,要如何在 IDEA 中设置字体大小呢? 这里介绍两种方法 ...

  2. vulnhub - tornado - wp

    coverY: 0 tornado 信息收集 目标开放了80,22端口. 访问80网页,是默认页面: 目录枚举 用dirsearch没有什么发现,换gobuster发现了一个bluesky目录.访问如 ...

  3. Pikachu漏洞靶场 Sql Inject(SQL注入)

    SQLi 哦,SQL注入漏洞,可怕的漏洞. 文章目录 SQLi 数字型注入(post) 字符型注入(get) 搜索型注入 xx型注入 "insert/update"注入 inser ...

  4. javaGUI入门之swing(一)

    javaGUI入门之swing(一) 前面学过javafx,发现他们有"异曲同工"之处,demo写起来也类似,无非是类名不一样.个人觉得实现一个桌面应用不应该只看用一种语言一种框架 ...

  5. 使用Winform开发自定义用户控件,以及实现相关自定义事件的处理

    在我们一些非标的用户界面中,我们往往需要自定义用户控件界面,从而实现不同的内容展示和处理规则,本篇内容介绍使用Winform开发自定义用户控件,以及实现相关自定义事件的处理. 1.用户控件的界面分析 ...

  6. 去哪儿网 (Qunar) DevOps 实践分享

    这是 2017 年王晓翔在 msup 全球软件案例研究峰会上的分享,重点分享了提高工程效率过程中存在的问题.取得的成果和要做的事情.内容详实,具有可操作性.我有幸看到了,所以在征得晓翔的同意下重新截图 ...

  7. 百度高德地图行政区域边界GeoJSON数据获取并绘制行政区域

    highcharts 是提供地图数据包的:https://www.highcharts.com/docs/maps/map-collection echart矢量地图或者地图绘制矢量图层,GeoJSO ...

  8. Solon 的热插拔能力框架 “solon.hotplug” 介绍

    <dependency> <groupId>org.noear</groupId> <artifactId>solon.hotplug</arti ...

  9. 让 Java 打包缩小一大半,Solon v1.9.3 发布

    相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...

  10. 【已解决】:Original error: Could not extract PIDs from ps output. PIDS: [], Procs: [“ps: uiautomator”]

    报错截图 因为appium服务用的是1.4.x版本,使用的是 uiatumator1.0在android7.0得不到支持,所以获取PIDS得到空. 解决办法 找到Appium安装目录下node_mod ...