bash变量类型及区别之浅谈

变量类型,区别

位置变量$0 $1,$2,$# $@ $*

变量的类型:本地变量、环境变量、位置变量

本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程包括当前shell的子进程均无效

环境变量:生效范围为当前shell进程及子进程

位置变量:$1,…..$n,${10}来表示,用于放脚本在脚本代码中调用通过命令行传递给它的参数



本地变量

变量赋值:name=‘value’,

可以使用引用value:

(1) 可以是直接字串; name=“root"

(2) 变量引用:name="$USER"

(3) 命令引用:name=`COMMAND`, name=$(COMMAND)

变量引用:${name}, $name

"":弱引用,其中的变量引用会被替换为变量值

'':强引用,其中的变量引用不会被替换为变量值,而保持原字符串

显示已定义的所有变量:set

删除变量:unset name

生效范围为当前shell进程,对当前shell之外的其他shell进程包括当前shell的子进程均无效

如下图:

blob.png

编辑一个本地变量:name=mage

echo $mage 可查询变量

 

 blob.png

新开一个窗口再次查询就不显示了,这就是本地变量


blob.png

这里我们写一个小脚本验证一下,

第一行是:shell程序开头的环境指定,这里我们用的是bash

第二行是:一些描述信息;本地变量测试脚本

然后定义var1=success

最后这行是为了方便我们下一步测试,让它把这个变量输出到屏幕上

blob.png

给它执行权限,然后用相对路径运行,然后显示出我们脚本里echo打印的信息;但是用echo $var1却没有。

So:本地变量只针对当前环境有效!




blob.png

我们再建立一个var2的脚本,将var1的变量也写进去

blob.png

没有显示var1的变量。

So:本地变量只对当前环境有效


 

【环境变量】

生效范围为当前shell进程及子进程

显示所有环境变量:

export

env

printenv

删除:unset name

上面我们说过:本地变量只能在当前环境(shell)下使用,

环境变量就是在变量前声明、赋值。加一个字符串:export

blob.png

用之前声明就行

还有一种写法:declare –x 等价于export

练习题:

编写脚本/root/bin/backup.sh,可实现将/etc/目录备份到/root/下生成etcYYYY-mm-dd

20160811 015.jpg

中间的是正文,其他为描述信息

blob.png

有了上下俩行输出信息提示,我们再运行脚本的时候就明白这个脚本是否已经开始和结束了。



位置变量


位置变量:在脚本代码中调用通过命令行传递给脚本的参数

$1, $2, …:对应第1、第2等参数,shift [n]换位置

$0: 命令本身

$*: 传递给脚本的所有参数,全部参数合为一个字符串

$@: 传递给脚本的所有参数,每个参数为独立字符串

$#: 传递给脚本的参数的个数

$@ $* 只在被双引号包起来的时候才会有差异


上题,如备份,用起来不灵活,如果我想要备份别的目录呢?或者备份到别的地方呢?

 想要灵活就需要参数

blob.png

 

blob.png

新建f1脚本。 f1的参数作为f2的参数 一个用$*一个用$@ 当我们执行f1.sh脚本的时,f2.sh脚本会调用f1.sh后跟的参数。简单讲就是上一个脚本参数的调用。

结果如下图:

 

 

blob.png

$1(引用第一个参数)打印出来的是全部

$2(引用第二个参数)打印出来的是空

因为$*调用的参数是一个整体(多个字符)

  所以第一个参数就是“a b c d”第二个参数自然就没有了

 

$@调用的参数是单个参数(字符)

 

blob.png

当我们把$*$@的双引号去掉后就没区别了

为被双引号引用时,所有的参数被认为是各个独立的单词

 

第十个参数怎么写?

${10}如果写成$10,系统会认为是$10的组合

blob.png

第十个参数是$10,然后结果是:a0

blob.png

 

blob.png

 

 blob.png

当加上大括号的时候就显示正确了

原创文章,作者:cszdz123,如若转载,请注明出处:http://www.178linux.com/33291

(0)
cszdz123cszdz123
上一篇 2016-08-12
下一篇 2016-08-12

相关推荐

  • 推荐-使用iptables作为网络防火墙构建安全的网络环境

    使用iptables作为网络防火墙构建安全的网络环境 使用iptables作为网络防火墙构建安全的网络环境 前言 网络防火墙的优势 实验拓扑图 实验环境 实验步骤 防火墙未设置前对所有服务器的测试 针对不同服务器进行”非法”访问 定义网络防火墙规则 再次针对不同服务器进行”非法”访问 测试服务器是否可访问 总结 前言 一般情况下iptables只作为主机防火…

    Linux干货 2016-03-31
  • VimTutor(上)

    柚子翻译,如有理解错误或翻译错误,请指正! VimTutor Vim是一款强大的文本编辑器,拥有多命令的特性,tutor解释了其中大多数命令。 tutor是为了描述足够多的Vim命令帮助你轻松使用Vim而被制作的,使Vim能成为一个可完成你所有工作意图的编辑器。 完成tutor的内容大概需要25-30分钟,所完成时间取决于你通过时间积累的经验。 注意: 1.…

    Linux干货 2015-10-18
  • 字符串处理

      一.字符串处理 v bash 的字符串处理工具: (一)字符串切片: ${#var}: 返回字符串变量var 的长度 例: [root@lxc ~]# a="     " [root@lxc ~]# echo ${#a} 5 [root@lxc ~]# ${var:offse…

    Linux干货 2016-11-24
  • keepalived实现lvs的高可用

    lvs可以做到内核级别的四层负载均衡,具有非常强悍的负载均衡能力。但是,当我们构建lvs的负载均衡集群的时候也会面临一些很严重的问题: lvs的单点故障:当lvs负载均衡器出现故障的时候,那么后端所有的服务器都将无法访问; lvs对后台服务器没有健康监测机制:当后台服务器宕机之后lvs还是会调度服务到后台的服务器; 所以我们就需要一款工具来解决以上问题。 k…

    2017-07-03
  • raid5 阵列

    1 fdisk 分区sdb2,sdd1,sde1, 2  新建raid5 [root@localhost ~]# mdadm -C /dev/md5 -a yes  -l 5  -n 3 -x 1 /dev/sdd1 /dev/sde1  /dev/sdf  /dev/sdb2  3   …

    Linux干货 2017-04-25
  • 笔记整理:权限管理1-基础权限管理&默认权限

    权限管理: 权限的分配根据owner和group来进行分配的   对于文件,各个权限的意义: r:可以使用工具查看内容 w:往里写 x:运行,提请内核发起一个进程 对于目录,各个权限的意义: r:用ls 查看目录列表   w:可以创建或删除目录中的文件   x:可以使用ls -l查看文件列表,也可cd进去   管理命令…

    Linux干货 2016-08-05

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-12 13:31

    有理论有实践,图文并貌,可以算是不错的笔记,但是,我们写博客是为了给别人看的,可以讲解变量是什么,有哪几类,各类变量的应用场景等。