目录
一、父shell和子shell:
二、系统预定变量
定义方式:
脚本举例
编辑
四、只读变量
五、撤销变量
六、小结
七、特殊变量
$n
$#
$*、$@
$?
一、父shell和子shell:
由于shell的原理可以理解为套娃,因此有父shell和子shell的概念
[root@hadoop-master sh_test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1876 1872 0 09:06 pts/0 00:00:00 -bash
root 1896 1876 0 09:06 pts/0 00:00:00 ps -f
[root@hadoop-master sh_test]# bash
[root@hadoop-master sh_test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1876 1872 0 09:06 pts/0 00:00:00 -bash
root 1897 1876 0 09:07 pts/0 00:00:00 bash
root 1908 1897 0 09:07 pts/0 00:00:00 ps -f
[root@hadoop-master sh_test]# exit
exit
[root@hadoop-master sh_test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 1876 1872 0 09:06 pts/0 00:00:00 -bash
root 1974 1876 0 09:39 pts/0 00:00:00 ps -f
可以看到,原本有一个登录进来启动的bash shell,我们再敲一个bash,会出现一个子进程,接下来执行脚本,将在子shell里面执行,可以使用exit退出。
开启父子shell需要特别注意环境变量的继承关系,变量即内存当中存储的数据,由于shell是套壳的,因此系统变量对父shell及子shell都可以产生作用,但在子shell中设置的当前变量,父shell不可见。
二、系统预定变量
环境变量即使用变量存储当前shell会话和工作环境的相关信息,
$HOME、$PWD、$SHELL、$USER
[root@hadoop-master sh_test]# echo $USER
root
[root@hadoop-master sh_test]# printenv HOME
/root
#用set可以看到所有的变量
[root@hadoop-master sh_test]# set | less
三、用户自定义变量
定义方式:
=号两边不能有空格,有的话要用引号引起来
[root@hadoop-master sh_test]# a="my var"
[root@hadoop-master sh_test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 2067 2063 0 11:04 pts/0 00:00:00 -bash
root 2158 2067 0 11:18 pts/0 00:00:00 ps -f
[root@hadoop-master sh_test]# echo $a
my var
进入子shell变量,局部变量就失效了:
[root@hadoop-master sh_test]# bash
[root@hadoop-master sh_test]# echo $a
[root@hadoop-master sh_test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 2067 2063 0 11:04 pts/0 00:00:00 -bash
root 2170 2067 0 11:19 pts/0 00:00:00 bash
root 2181 2170 0 11:19 pts/0 00:00:00 ps -f
[root@hadoop-master sh_test]# exit
exit
使用export可以将局部变量升级为全局变量
[root@hadoop-master sh_test]# export a
[root@hadoop-master sh_test]# bash
[root@hadoop-master sh_test]# echo $a
my var
但是,在子shell里面的变量修改不会改变外层父shell的值,如
[root@hadoop-master sh_test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 2067 2063 0 11:04 pts/0 00:00:00 -bash
root 2170 2067 0 11:19 pts/0 00:00:00 bash
root 2183 2170 0 11:24 pts/0 00:00:00 ps -f
[root@hadoop-master sh_test]# a="your var"
[root@hadoop-master sh_test]# echo $a
your var
[root@hadoop-master sh_test]# exit
exit
[root@hadoop-master sh_test]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 2067 2063 0 11:04 pts/0 00:00:00 -bash
root 2184 2067 0 11:24 pts/0 00:00:00 ps -f
[root@hadoop-master sh_test]# echo $a
my var
脚本举例
其中:
写个打印脚本执行:
[root@hadoop-master sh_test]# ./hello.sh
Hi,dear~
[root@hadoop-master sh_test]# source hello.sh
Hi,dear~
hi,my var
由于直接用相对/绝对路径会新开启一个子shell,作为局部变量的my_var是打印不出来的,而source在当前bash环境直接执行
使用export将my_var升级为全局变量后,子shell也可以使用了:
[root@hadoop-master sh_test]# export my_var
[root@hadoop-master sh_test]# ./hello.sh
Hi,dear~
hi,my var
四、只读变量
只能读取不能修改
[root@hadoop-master sh_test]# readonly b=5
[root@hadoop-master sh_test]# b=10
-bash: b: 只读变量
五、撤销变量
使用unset,只读变量不能撤销
[root@hadoop-master sh_test]# unset b
-bash: unset: b: 无法反设定: 只读 variable
六、小结
- 变量名称可由数字、变量、下划线组成,但不能以数字开头,环境变量名建议大写。
- 等号两变不能空格
- bash中,变量默认字符串类型,无法直接进行数值计算。
- 变量值若有空格需要用引号引起来
- export、unset、readonly的作用
七、特殊变量
对脚本的输入参数进行捕获和处理
$n
n为数字:
- 0:脚本名称
- 1-9:第1-9个参数
- 10或以上:参数需要用{}括起来如${10}
[root@hadoop-master sh_test]# hello.sh xiaoliang
Hi,dear~
hi,xiaoliang
区别单双引号
[root@hadoop-master sh_test]# ./hello.sh
This is ./hello.sh
Hi,dear~
hi,
==========
=====$n=====
$#
获取输入参数的个数,对于测试脚本:
[root@hadoop-master sh_test]# ./hello.sh
This is ./hello.sh
hi,
hi,
=====0个输入参数=====
添加输入参数:
[root@hadoop-master sh_test]# ./hello.sh windows
This is ./hello.sh
hi,windows
hi,
=====1个输入参数=====
[root@hadoop-master sh_test]# ./hello.sh windows linux
This is ./hello.sh
hi,windows
hi,linux
=====2个输入参数=====
$*、$@
均代表命令行中所有参数:
[root@hadoop-master sh_test]# ./hello.sh windows linux
This is ./hello.sh
hi,windows
hi,linux
=====$*=====
windows linux
=====$@=====
windows linux
区别:$*将所有参数当做一个整体,而$@将参数当做一个数组,可以在循环中进行遍历
$?
最后一次执行命令的返回状态,若为0,证明上一次命令正确执行,若非0,证明上一个命令执行不正确(具体哪个数由命令自己决定)