- 一、变量简介
- 二、变量分类
- 1、本地变量
- 2、环境变量
- 3、位置变量
- 4、特殊变量
- (1)==$?==:接收上一条命令的返回状态码(返回状态码在0-255之间)
- (2)==$#==:参数个数
- (3)==$*或者 $@==:所有的参数
- (4)==$$==:获取当前shell脚本的进程号(PID)(可以实现脚本自杀 )(或者使用exit命令直接退出也可以 exit [num])
- 三、单引号,双引号,反引号
- 1、==echo'x'== :单引号不解析变量
- 2、==echo"x"==:双引号会解析变量
- 3、echo``:反引号是执行并引用一个命令的执行结果
- 4、==echo ' "x" '==:直接输出"x"
- 5、==echo " 'x' "==:'解析变量值'
- 变量不需要声明,初始化不需要指定类型
- 变量命名
(1)只能使用数字,字母和下划线,且不能以数字开头
(2)变量名区分大小写
(3)建议命名要通俗易懂
例:
[root@hadoop61 shellDemo]# ab=1 [root@hadoop61 shellDemo]#
- 显示变量值使用echo命令(类似于java中的system.out),加上 $变量名,也可以使用 ${变量名}
例:
[root@hadoop61 shellDemo]# echo $ab
1
[root@hadoop61 shellDemo]# echo ${ab}
1
注:$变量名和 ${变量名}还是有区别的,{ }里的是一个整体
[root@hadoop61 shellDemo]# echo ${ab}x
1x
[root@hadoop61 shellDemo]# echo $abx
[root@hadoop61 shellDemo]# echo $ab x
1 x
二、变量分类
1、本地变量
(1)只对当前shell进程有效,对当前进程的子进程和其他shell进程无效
(2)定义:x=y
(3)变量引用:${x}
(4)取消变量:unset x
(5)相当于java中的私有变量(private),只能当前类使用,子类和其他类都无法使用
注:一般情况下,不需要取消变量
解释什么是子进程:
(1)输入pstree查看进程信息,可以看到sshd───sshd─┬─bash───pstree一行,我们执行的pstree,是通过sshd连到这台机器的,我们是通过bash方式开的shell进程,在里面执行pstree命令
[root@hadoop61 shellDemo]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd─┬─bash───pstree
│ └─2*[bash]
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
(2)这时再输入bash,再执行pstree查看,发现那一行又多了个bash,说明我们现在所处的位置就是上面shell进程的一个子进程里面,
[root@hadoop61 shellDemo]# bash
[root@hadoop61 shellDemo]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─auditd───{auditd}
├─chronyd
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─login───bash
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd─┬─bash───bash───pstree
│ └─2*[bash]
├─systemd-journal
├─systemd-logind
(3)可以通过exit回到上一级
[root@hadoop61 shellDemo]# exit exit2、环境变量
- 简介:自定义的环境变量对当前shell进程及其子shell进程有效,对其他的shell进程无效
- 定义:export x=y (定义临时的环境变量)
- 注:
(1)对所有shell进程都有效需要配置到配置文件中 (定义永久的环境变量)
vi /etc/profile
source /etc/profile
(2)相当于java中的protected修饰符,对当前类,子孙类,以及同一个包下面可以共用。
(3)和Windows中的环境变量比较类似
- 写法:$1,$2,$3,……$10……
- test.sh 3 89
(1)$0:脚本本身
(2)$1:脚本的第一个参数
(3)$2:脚本的第二个参数
相当于java中main函数中的args参数,可以获取外部参数。
public static void main(string[] args){
} - 操作:
(1)先写个脚本b.sh演示一下
[root@hadoop61 shellDemo]# vi b.sh
(2)
#!/bin/bash echo $0 echo $1 echo $2
(3)执行bash b.sh,可以看到$0打印了个b.sh(代表脚本自身),$1、$2都没值
[root@hadoop61 shellDemo]# bash b.sh b.sh
(4)后面可以传个参数a、b(参数之间空格隔开就行)
再传个参数a、b、c,发现c参数没出来,因为之前echo的时候只echo了两个
[root@hadoop61 shellDemo]# bash b.sh a b b.sh a b [root@hadoop61 shellDemo]# bash b.sh a b c b.sh a b
- 总结:位置变量其实就是可以获取到脚本后面的参数,脚本后面的参数是从 $1开始的,后面有几个参数,就有 $几。
如果上一条命令执行成功,返回的状态码就是0:如果上一条命令执行失败,返回的状态码就是返回状态码在0-255之间的数字)
[root@hadoop61 shellDemo]# echo $? 0 [root@hadoop61 shellDemo]# lk -bash: lk: 未找到命令 [root@hadoop61 shellDemo]# echo $? 127 [root@hadoop61 shellDemo]# pwd /usr/local/shellDemo [root@hadoop61 shellDemo]# echo $? 0
注:Linux退出状态代码
| 代码 | 描述 |
|---|---|
| 0 | 命令成功完成 |
| 1 | 通常的未知错误 |
| 2 | 误用shell命令 |
| 126 | 命令无法执行 |
| 127 | 没有找到命令 |
| 128 | 无效的退出参数 |
| 128+x | 使用Linux信号x 的致命错误 |
| 130 | 使用Ctrl -C终止的命令 |
| 235 | 规范外的退出状态 |
- 编辑脚本 b.sh,加一个echo $#
[root@hadoop61 shellDemo]# vi b.sh #!/bin/bash echo $0 echo $1 echo $2 echo $3 echo $#
- 注:$#获取的是脚本后面参数的个数
[root@hadoop61 shellDemo]# bash b.sh a b c b.sh a b c 3 [root@hadoop61 shellDemo]# bash b.sh a b c s b.sh a b c 4 [root@hadoop61 shellDemo]# bash b.sh a b c s f b.sh a b c 5(3)$*或者 $@:所有的参数
$*或者 $@可以获取到脚本后边所有的参数列表
[root@hadoop61 shellDemo]# vi b.sh #!/bin/bash echo $0 echo $1 echo $2 echo $# echo $* echo $@
[root@hadoop61 shellDemo]# bash b.sh a b c s f g b.sh a b 6 a b c s f g a b c s f g(4)$$:获取当前shell脚本的进程号(PID)(可以实现脚本自杀 )(或者使用exit命令直接退出也可以 exit [num])
kill脚本的三种方法:
- 方法一:
1、新写一个c.sh脚本
[root@hadoop61 shellDemo]# vi c.sh
注:sleep 100:让程序歇100秒,不然脚本执行完,echo $$就没了,这样看不到效果
#!/bin/bash echo $$ sleep 100
2、执行bash c.sh 发现输出2320
[root@hadoop61 shellDemo]# bash c.sh 2320
注:新开一个克隆会话,针对所有进程过滤进程c.sh,可以看到PID为2320(只看上面第一行,因为下面一行是grep命令本身)
[root@hadoop61 ~]# ps -ef|grep c.sh root 2320 2195 0 16:24 pts/0 00:00:00 bash c.sh root 2323 2302 0 16:25 pts/1 00:00:00 grep --color=auto c.sh
3、可以在克隆会话里面输入kill 2320,这样这个程序就终止了
[root@hadoop61 ~]# kill 2320
4、此时会话里面就显示已终止
[root@hadoop61 shellDemo]# bash c.sh 已终止
- 方法二:
1、编辑c.sh脚本,输入kill $$,实现脚本自杀,直接停止这个脚本。
[root@hadoop61 shellDemo]# vi c.sh #!/bin/bash kill $$ sleep 100
2、执行c.sh检查一下,发现已停止
[root@hadoop61 shellDemo]# bash c.sh 已终止
- 方法三:
1、执行exit也可以退出脚本,exit后面跟状态码,如果是正常退出,状态码就写0:;如果认为是非正常退出,状态码就写其他数字
[root@hadoop61 shellDemo]# vi c.sh #!/bin/bash #kill $$ exit 10 sleep 100
2、此时已正常退出
[root@hadoop61 shellDemo]# bash c.sh
3、echo $? 可以看到上一条命令的返回状态码
[root@hadoop61 shellDemo]# echo $? 10三、单引号,双引号,反引号
| 符号 | 作用 |
|---|---|
| echo’x’ | 单引号不解析变量 |
| echo"x" | 双引号会解析变量 |
| echo`` | 反引号是执行并引用一个命令的执行结果,类似于$(…) |
| echo ’ “x” ’ | |
| echo " ‘x’ " |
简介:直接原样输出
[root@hadoop61 shellDemo]# echo '$Java_HOME' $Java_HOME2、echo"x":双引号会解析变量
简介 :获取具体路径
[root@hadoop61 shellDemo]# echo "$JAVA_HOME" /data/soft/jdk1.83、echo``:反引号是执行并引用一个命令的执行结果
简介:解析并执行,可以看到下面命令报错了
[root@hadoop61 shellDemo]# echo `$JAVA_HOME` -bash: /data/soft/jdk1.8: 是一个目录
注:echo``也可以写成$(…)
[root@hadoop61 shellDemo]# echo $($JAVA_HOME) -bash: /data/soft/jdk1.8: 是一个目录4、echo ’ “x” ':直接输出"x"
[root@hadoop61 shellDemo]# echo '"$JAVA_HOME"' "$JAVA_HOME"5、echo " ‘x’ ":‘解析变量值’
[root@hadoop61 shellDemo]# echo "'$JAVA_HOME'" '/data/soft/jdk1.8'



