变量类型,区别
位置变量$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的子进程均无效
如下图:
编辑一个本地变量:name=mage
echo $mage 可查询变量
新开一个窗口再次查询就不显示了,这就是本地变量
这里我们写一个小脚本验证一下,
第一行是:shell程序开头的环境指定,这里我们用的是bash
第二行是:一些描述信息;本地变量测试脚本
然后定义var1=success
最后这行是为了方便我们下一步测试,让它把这个变量输出到屏幕上
给它执行权限,然后用相对路径运行,然后显示出我们脚本里echo打印的信息;但是用echo $var1却没有。
So:本地变量只针对当前环境有效!
我们再建立一个var2的脚本,将var1的变量也写进去
没有显示var1的变量。
So:本地变量只对当前环境有效
【环境变量】
生效范围为当前shell进程及子进程
显示所有环境变量:
export
env
printenv
删除:unset name
上面我们说过:本地变量只能在当前环境(shell)下使用,
环境变量就是在变量前声明、赋值。加一个字符串:export
图①
用之前声明就行
还有一种写法:declare –x 等价于export
练习题:
编写脚本/root/bin/backup.sh,可实现将/etc/目录备份到/root/下生成etcYYYY-mm-dd
中间的是正文,其他为描述信息
有了上下俩行输出信息提示,我们再运行脚本的时候就明白这个脚本是否已经开始和结束了。
【位置变量】
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, …:对应第1、第2等参数,shift [n]换位置
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $* 只在被双引号包起来的时候才会有差异
上题,如备份,用起来不灵活,如果我想要备份别的目录呢?或者备份到别的地方呢?
想要灵活就需要参数
新建f1脚本。 把f1的参数作为f2的参数 一个用$*一个用$@。 当我们执行f1.sh脚本的时,f2.sh脚本会调用f1.sh后跟的参数。简单讲就是上一个脚本参数的调用。
结果如下图:
$1(引用第一个参数)打印出来的是全部
$2(引用第二个参数)打印出来的是空
因为$*调用的参数是一个整体(多个字符)
所以第一个参数就是“a b c d”第二个参数自然就没有了
$@调用的参数是单个参数(字符)
当我们把$*和$@的双引号去掉后就没区别了
为被双引号引用时,所有的参数被认为是各个独立的单词
第十个参数怎么写?
${10}如果写成$10,系统会认为是$1和0的组合
第十个参数是$10,然后结果是:a0
当加上大括号的时候就显示正确了
原创文章,作者:cszdz123,如若转载,请注明出处:http://www.178linux.com/33291
评论列表(1条)
有理论有实践,图文并貌,可以算是不错的笔记,但是,我们写博客是为了给别人看的,可以讲解变量是什么,有哪几类,各类变量的应用场景等。