Shell全局变量、局部变量与特殊变量的具体使用

目录
  • 1、全局变量(环境变量):
  • 2、局部变量(本地变量):
  • 3、关于局部变量的其它一些问题
  • 4、Shell的特殊变量:

变量类型:全局变量(环境变量)和局部变量(本地变量)
环境变量可以在定义它们的shell及其派生出来的任意子进程的shell中使用。局部变量只能在定义它们的函数/脚本中使用。还有一些变量是用户创建的,其他的则是专用的shell变量。

1、全局变量(环境变量):

环境变量可用于定义shell的运行环境,环境变量可以在配置文件中定义与修改,也可以在命令行中设置,但是命令行中的修改操作在终端重启时就会丢失,因此最好在配置文件中修改(用户家目录的“.bash_profile“文件或者全局配置“/etc/profile”、“/etc/bashrc”文件或者“/etc/profile.d”文件中定义。)将环境变量放在profile文件中,每次用户登录时这些变量值将被初始化。比如HOME、USER、SHELL、UID等再用户登录之前就已经被/bin/login程序设置好了。

常见系统环境变量:

TMOUT:设置自动退出的误操作等待时间
HOSTTYPE:系统文件系统类型
HISTSIZE:历史命令记录条数
HOME:用户登录时进入的目录,家目录
UID:当前用户的id
SHELL:当前shell解释器
PWD:当前所在路径(每改变一次目录,该值就会改变)
PATH:可执行文件默认路径
等等。

可以用echo来显示查看全局变量(eg:echo $HOME)。env(或printenv)、set也可以用来查看系统的环境变量,但不是单独查看。而用unset临时取消环境变量(eg:unset USER),要永久生效还是要写到配置文件中

自定义环境变量(采用export):
①export 变量名=value
②变量名=value;export 变量名
③declare -x 变量名=value
这里依旧是临时生效,在shell终端关闭后就消失了,写到配置文件中则永久生效(注意:写到配置文件中后需要运行一遍配置文件的脚本才可生效,否则等重启时生效)

命令行的三种方式测试如下:

关于环境变量PATH与export的更详细的内容,可参考: Linux环境变量与系统编程学习笔记

2、局部变量(本地变量):

本地变量在用户当前的shell生存期的脚本中使用。在一个函数中将某个变量声明为local,则该变量就是一个局部变量,只在本函数中有效。
定义:

变量名=value
变量名=’value’
变量名=”value”
shell中变量名的要求:一般遵循字母、数字、下滑线组成,不能以数字开头

eg:以下脚本执行后(交互式非交互式都可以测试)输出什么( c与 {c}等同)?

a=192.168.1.1
b='192.168.1.2'
c="192.168.1.3"
echo "A=$a"
echo "B=$b"
echo "C=${c}"
a=192.168.1.1-$b
b='192.168.1.2-$b'
c="192.168.1.3-$b"
echo "A=$a"
echo "B=$b"
echo "C=${c}"

输出结果如下:

A=192.168.1.1
B=192.168.1.2
C=192.168.1.3
A=192.168.1.1-192.168.1.2
B=192.168.1.2-$b
C=192.168.1.3-192.168.1.2-$b

总结分析:
单引号与双引号的区别在于:单引号内若存在变量,存在的变量当做字符串不会被解析,原样输出;而双引号中若存在变量,该变量会被解析出其具体的值再加入到字符串中。①不加引号可以直接定义内容包含数字、字符串、路径名等,适合定义数字②单引号适合于纯定义字符串,③而双引号适合于字符串的内容中包含有变量的内容的定义。(习惯:数字以及不带空格的简单字符串不加引号,其它长的特别是有空格的字符串加双引号;遇到“$变量名”,但不想解析的加单引号,但一般出现$都是为了解析变量,所以单引号较少使用)

注意:单引号与双引号的特点不具有普遍性,如下:
在普通shell中:

ETT=123
echo '$ETT'	//打印$ETT(单引号不解析)
echo "$ETT"    //打印123(双引号解析)

而在awk中调用shell变量:

awk 'BEGIN {print '$ETT'}'//打印123(单引号解析)
awk 'BEGIN {print "$ETT"}'//打印$ETT(双引号不解析)

虽然在awk中不具有普遍性,但是在普通Shell中还是具有普遍性的。

3、关于局部变量的其它一些问题

①用反引号将命令的结果作为变量名是常用的方法,eg:cmd=`date +%F`
②用$符号将命令的结果作为变量名也比较常用,eg:cmd=$(date +%F)
③变量在大括号上的使用:在以时间、主机名等为包名一部分来打包的时候常用

eg1:用时间作为文件名的一部分打包

cmd=$(date +%F)    //由于`date +%F`的反引号不容易辨认,就不太使用`date +%F`
tar -zcf code_$(date+ %F)_kang.tar.gz /etc //没有问题
tar -zcf code_`date +%F`_kang.tar.gz /etc   //没有问题
tar -zcf code_kang_$cmd.tar.gz /etc    //没有问题
tar -zcf code_$cmd_kang.tar.gz /etc	//会有歧义,因为系统会不清楚是应该解析$cmd还是cmd_kang
tar -zcf code_${cmd}_kang.tar.gz /etc  //不会有歧义

对后两种测试结果如下(不加{}的与理想结果是不符的):

eg2:用主机名与时间打包

cmd=$(date +%F)
host=$(hostname)
tar -zcf code_${cmd}_${host}.tar.gz /etc   

测试:

养成将字符串括起来使用的习惯防止不易发现的错误。

4、Shell的特殊变量:

$0:获取当前执行的shell脚本的文件名(执行时给定的是完整路径则获取到的也是完整路径)

两个命令与$0的组合测试:获取一个带路径的文件的路径名与文件名两部分

dirname(获取目录名部分)
basename(获取文件名部分)

测试:

$n:获取当前执行的shell脚本的第n个参数,如果n=0则获取的是脚本的文件名。如果n>9则需要用大括号括起来,eg:${21}

测试$n:

$*:获取当前执行的shell的所有参数,将所有的命令行参数视为单个字符串
$#:获取当前shell命令行中参数的总个数
$@:这个程序的所有参数"$1" "$2" "$3" "...",这是将参数传递给其它程序的最佳方式,因为它会保留所有内嵌在每个参数里的任何空白

$*与$@的区别:
$*将命令行的所有参数视为一个字符串:"$1$2$3..."
$@将命令行的每个参数视为单个的字符串:"$1" "$2" "$3" ...

基本测试如下:

获取状态变量:
$$:获取当前的shell进程号
$?:获取执行上一个指令的返回值(0为成功,非零为失败),可以对上一个命令执行是否成功进行判断。
$_:在此之前执行的命令或脚本的最后一个参数

$?变量其实获取的是上一个程序返回给父进程shell的返回值(该值在0-255之间:0表示运行成功,2表示权限拒绝,1~125为运行失败原因是脚本命令、系统命令错误或参数传递错误,126为找到该命令但是无法执行,127为无该命令/程序,>128表示命令被系统强制结束)

$?的不同返回值测试:

$?的值范围测试如下:

$?在脚本中的应用:

常用来判断上一步是否成功(压缩失败打印ERROR压缩成功打印OK):

到此这篇关于Shell全局变量、局部变量与特殊变量的具体使用的文章就介绍到这了,更多相关Shell全局变量、局部变量与特殊变量内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux Shell字符串变量拼接与赋值的使用

    目录 1.字符串拼接 2.定义值为双引号或单引号的字符串 3.在单引号和双引号字符串中取变量值 最近在工作用到shell脚本,用到了字符串变量的拼接,同时需要对字符串进行赋值,这里与大家分享一下, 1.字符串拼接 shell脚本里面可以对字符串进行拼接,并且可以将拼接后的值赋予给另外一个变量,下图给出了几种字符串拼接的样例,供大家参考. #!/bin/bash a="123"  # 定义a变量为"123" b="456"  # 定义b变量为&qu

  • shell脚本中整数型变量自增(加1)的几种实现

    在shell脚本中,有时为了计数,需要编写整数型变量,并用自增来显示. shell脚本中的整数型变量,自增有多种实现方式,整体测试脚本如下: #!/bin/sh #本脚本测试shell脚本中整型变量自增 加1的几种方法 #定义整型变量 a=1 echo $a #第一种整型变量自增方式 a=$(($a+1)) echo $a #第二种整型变量自增方式 a=$[$a+1] echo $a #第三种整型变量自增方式 a=`expr $a + 1` echo $a #第四种整型变量自增方式 let a+

  • Shell eval通过变量获取环境变量的方法实现

    场景 系统中存在环境变量 USER=iceber 脚本中存在一个变量 env_name=USER 需要通过变量 env_name 获取到环境变量 USER 的值 错误示例 $ # 环境中已存在环境变量 USER $ env_name=USER $ echo ${$env_name} ${$env_name}: bad substitution 很显然,直接使用 $ 嵌套来获取值是行不通的 正确示例 $ # 环境中已存在环境变量 USER $ env_name=USER $ eval echo '

  • 详解shell 变量的高级用法示例

    变量删除和替换 案例:从头开始匹配,将符合最短的数据删除 (#) variable_1="I love you, Do you love me" echo $variable_1 variable_2=${variable_1#*ov} echo $variable_2 案例:从头开始匹配,将复合最短的数据删除(##) varible_3=${variable_1##*ov} echo $varible_3 案例:替换字符串,只替换第一次匹配成功的(/) echo $PATH var6

  • 详解shell 变量

    1.简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据.脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell变量也遵循这个规则. 在Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储.这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同.如C/C++ ,变量分为整数.浮点数.字符串.布尔等多种类型.当然,如果有必要

  • shell判断变量是否含某个字符串的6种方法

    目录 方法一:利用grep查找 方法二:利用字符串运算符 方法三:利用通配符 方法四:利用case in 语句 方法五:利用替换 方法六:利用expr,如果包含会返回位置 方法一:利用grep查找 strA="long string" strB="string" result=$(echo $strA | grep "${strB}") if [[ "$result" != "" ]] then echo

  • Shell特殊变量(Shell $#、$*、$@、$?、$$)的使用

    上节我们讲到了 $n,它是特殊变量的一种,用来接收位置参数.本节我们继续讲解剩下的几个特殊变量,它们分别是:$#.$*.$@.$?.$$. Shell 特殊变量及其含义 变量 含义 $0 当前脚本的文件名. $n(n≥1) 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是 $1,第二个参数是 $2. $# 传递给脚本或函数的参数个数. $* 传递给脚本或函数的所有参数. $@ 传递给脚本或函数的所有参数.当被双引号" "包含时,$@ 与 $* 稍有不同,我们将

  • C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别

    局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序或代码块. 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用:在其它地方全局变量起作用. 全局变量在程序开始运行期间就已经在内存中开辟了内存空间,直到程序结束才会释放这块内存空间. 全局变量要在其他文件中使用,需显示的声明这个变量,使用extern关键字声明(extern int

  • PHP变量作用域(全局变量&局部变量)&global&static关键字用法实例分析

    本文实例讲述了PHP变量作用域(全局变量&局部变量)&global&static关键字用法.分享给大家供大家参考,具体如下: 我们知道,变量呢,其实就相当于我们用来储存信息的容器.关于它的命名规则什么的,相信大家也是比较清楚的,这里就不赘述了.这里呢,主要就来看PHP变量的两个作用域,全局变量&局部变量. 看到这两个变量作用域,相信大家脑海里会浮现两个单词global&static.没错,就是这两个词. 我们知道,在所有函数外部定义的变量,拥有全局作用域.除了函数外

  • 深入了解python全局变量,局部变量和命名空间

    目录 函数中的全局和局部变量 嵌套函数中的全局变量 非局部变量 Python 使用全局和局部变量的方式是特立独行的.虽然在许多或大多数其他编程语言中,如果未另行声明,变量将被视为全局变量,而 Python 则以相反的方式处理变量.如果没有另外声明,它们是本地的.这种方法背后的驱动原因是全局变量通常是不好的做法,应该避免.在大多数情况下,您想使用全局变量,最好使用参数将值放入函数或返回值以将其取出.与许多其他程序结构一样,Python 也通过设计强加了良好的编程习惯. 因此,当您在函数定义中定义变

  • linux shell脚本对未定义变量的判断以及if的用法详解

    环境 操作系统:win10 虚拟机:centos7 需求 因为公司有个脚本,是用于启动程序的,但是每次启动都要手动做如下两个操作: ①先查询之前的进程ID ②杀死之前的,在启动新了 时间长了弄得我很烦躁,所以就琢磨下,把上面的的操作一起整合到启动脚本里去. 最开始我是这么写的: #!/bin/bash echo "ggjob-search..." pid=`ps -ef|grep -w ggjob-search|grep -v grep|grep -v ggjob-search.sh|

  • 简单了解java局部变量与成员变量的区别

    这篇文章主要介绍了简单了解java局部变量与成员变量的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package java04; /* 局部变量和成员变量的不同: 1.定义的位置不一样 局部变量:定义在方法内部 成员变量:在方法外部,直接写在类中 2.作用范围不一样 局部变量:只有方法中能使用,除了方法就不能用 成员变量:整个类都可以用 3.默认值不一样 局部变量:无默认值,先赋值在使用 成员变量:如果没有赋值有默认值 4.内存的位置不

  • 浅析Java中局部变量与成员变量同名解决技巧

    要想区分这哥俩,首先,我们得知道它们分别是什么.先从成员变量下刀. 成员变量 我们来研究一个事物: 属性:外在特征:例如人的身高,体重 行为:能够做什么:例如人有说话,打球等行为. 而在Java语言中,最基本的单位是类,类就是用来体现事物的. 用类class来描述事物也是如此: 属性:对应类中的成员变量 行为:对应类中的成员函数 定义类其实就是在定义类中的成员(成员变量和成员函数) 拓展:类是一个抽象的概念,而对象就是类的具体的存在,体现.例如:生活中的汽车,可以看做一个类,我们称之为汽车类,每

  • JavaScript中全局变量、函数内变量以及常量表达式的效率测试

    var r, s = "this is a very very looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong string", x = /^\s+|\s+$/g; document.writeln("字符串测试 "); (function(){ document.write("全局->全局:"); var t = new Date(); for(

  • Shell编程中的特殊变量之进程状态变量介绍

    进程状态变量 1.$$获取当前shell的进程号(PID) 2.$!执行上一个指令的PID 3.$?获取执行上一个命令的返回值(0为成功,非零为失败,这个很常用) 4.$_在此之前执行的命令或脚本的最后一个参数 复制代码 代码如下: cat> test$.sh echo'$$='$$ echo'$!='$! echo'$?='$? echo'$@='$@ echo'$_='$_ #输出如下 sh test\$.sh 1 2 3 $$=2556 $!= $?=0 $@=1 2 3 $*和$@的区别

  • Shell编程中的特殊变量之位置变量介绍

    1.$0 获得当前脚本的文件名,包括路径. 复制代码 代码如下: #写一个测试脚本 vim test.sh #内容如下 dirname$0 basename$0 #执行一下 bash$(pwd)/test.sh #输出如下 /home/jane test.sh 2.$n 获取当前执行脚本的第n个参数,n=1..9,$0,为当前脚本名.如果n大于9,使用${10} 复制代码 代码如下: echo'echo '$(seq-s " $"1 5|sed's/1/$1/') > test_

  • CentOS中环境变量与配置文件的深入讲解

    前言 CentOS的环境变量配置文件体系是一个层级体系,这与其他多用户应用系统配置文件是类似的,有全局的,有用户的,有shell的,另外不同层级有时类似继承关系. 本文将详细介绍关于CentOS环境变量与配置文件的相关内容,下面话不多说了,来一起看看详细的介绍吧 什么是环境变量 bash shell用一个叫做 环境变量(environment variable) 的特性来存储有关shell会话和工作环境的信息.即允许在内存中存储数据,使得在程序或shell中运行的脚本能够访问它们. 在bash

随机推荐