shell中变量的分类
第一种分类方式
- 系统变量:比如$JAVA_HOME
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $JAVA_HOME /home/dongmu/jdk1.8.0_121 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $USER root [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $SHELL /bin/bash [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $PWD /home/dongmu/shellStudy [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# printenv USER root [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# printenv JAVA_HOME /home/dongmu/jdk1.8.0_121
- 用户变量
第二种分类方式
- 全局变量:父bash进程种的变量可以被子bash进程访问你到。
- 局部变量:如果父进程种定义的是局部变量,则这个父bash里面的子bash无法访问这个变量。
自定义变量
- 变量名=变量值(等号前后不能有空格,等号前面有空格就会当成命令到bin或者sbin下面去找,如果我们变量值里面有空格怎么办?就直接带上引号就行了)
- 撤销变量:unset 变量名
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=21 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo a a [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a 21 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# unset a [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]#
- 只读变量的赋值readonly 变量名=变量值,只读变量不能unset。也不能进行修改。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# readonly b=12 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $b 12 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# unset b -bash: unset: b: cannot unset: readonly variable [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# b=13 -bash: b: readonly variable
这种定义变量的方式是全局变量还是局部变量呢?
实验一:
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# my_var= "hello word!" -bash: hello word!: command not found [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# my_var="hello word!" [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var hello word! env 是查看全局变量 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# env | grep my_var set 是查看所有的变量 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# set | grep my_var my_var='hello word!' 所以可以发现这种定义变量的方式是局部变量
实验二:我们直接启动一个子bash看能不能访问这个变量不就得了
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# exit exit [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var hello word!
这里依然能够得到结论这是一个局部变量。
如何把他变成一个全局变量呢?
使用export命令即可。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# export my_var [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var hello word!
这里要注意一个问题,就是我们如果在子bash里面把变量的值改了,在子bash里面访问是更改之后的值,但是在父bash里面还是原来的值,我们即使在子bash里面进行export也不能进行全局的更改。但是会影响到这个子bash的子bash里面的值。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var hello word! [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var hello word! [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# export my_var="hello Donmu" [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $my_var hello Donmu
Shell中环境变量的问题
加入我们写了一个脚本hello.sh
我们直接执行hello.sh是会报错的。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# hello.sh -bash: hello.sh: command not found [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh #!/bin/bash echo "hello world!"
我们怎么把它变成一个命令呢?
直接把这个文件拷贝到/bin目录下即可,但是/bin目录下一般是一些系统配置的命令,我们一般不这样做,那怎么办呢?
- 把我们这个文件的存放目录配置到PATH系统变量里面去就行了。这里就不演示了。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/dongmu/jdk1.8.0_121/bin:/home/dongmu/jdk1.8.0_121/jre/bin:/root/bin
Shell中的特殊变量
$n
如果我们想在执行shell脚本的时候,携带参数进行执行。
$1~$9表示第1-9个参数,在往上就用${12}
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh #!/bin/bash echo "hello world!" echo $1 echo $2 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sh hello.sh dongmu beihai hello world! dongmu beihai
注意:如果我们脚本里
echo "$n" 这个n会被当成变量来解析 echo '$n' 这个n就会原封不动地输出
验证:
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh #!/bin/bash echo "hello world!" echo "$n" echo '$n' echo $1 echo $2 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . hello.sh dongmu beihai hello world! $n dongmu beihai 这里由于我没有定义这个n变量所以第二行是空的。
$n:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及 加强脚本的健壮性。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim hello.sh [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh #!/bin/bash echo "hello world!" echo "$n" echo '$n' echo $1 echo $2 echo "输入参数的个数是$#" [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . hello.sh dongmu beihai yuweimian hello world! $n dongmu beihai 输入参数的个数是3
$*和$@:获取所有的输入参数
- 区别: $*是把所有的参数当成一个整体,$@是把参数分开处理。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim hello.sh [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh #!/bin/bash echo "hello world!" echo "$n" echo '$n' echo $1 echo $2 echo "输入参数的个数是$#" echo $* echo $@ [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . he -bash: he: No such file or directory [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . hello.sh dongmu beihai yuweimian hello world! $n dongmu beihai 输入参数的个数是3 dongmu beihai yuweimian dongmu beihai yuweimian
$?:获取最后一次命令的执行结果
如果但会的是0表示上一次命令执行成功,不为0表示失败。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 0 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# .s -bash: .s: command not found [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 127 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ls hello.sh test third.sh [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $? 0
Sehll中变量的运算
使用expr 进行运算
expr a + b:要注意加号两边要有空格,不然就会被当成字符串
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 1 + 2 3 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 1 + 2 + 5 8 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 1 + 2 + 5 - 3 5 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 1 + 2 + 5 - 3 - 12 -7 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 5 * 2 10
对于乘法要用对*进行转义,因为linux里面*已经有了特殊的含义。
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 5 * 2 10 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr 5 - 5 * 2 + 5 0
上面这种运算很麻烦,所以linux提供了下面的这种方式
使用$[]或者$(())
如果我们直接运算就会把他当成字符串 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=1+5 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a 1+5 使用$[]或者$(()) [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=$[1+5] [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo a a [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a 6 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=$((4+5)) [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $a 9 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# expr $[5*6/3*5] 50 [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $[2-3*6/4*8] -30
如果我们想把表达式的值直接赋值给一个变量,怎么办?
使用$()或者``
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=expr 1 + 3 -bash: 1: command not found [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=`expr 1 + 2` [root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# a=$(expr 1 + 2)



