栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Shell2:变量

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Shell2:变量

文章目录
  • 一、变量简介
  • 二、变量分类
    • 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. 变量命名
    (1)只能使用数字,字母和下划线,且不能以数字开头
    (2)变量名区分大小写
    (3)建议命名要通俗易懂
    例:
[root@hadoop61 shellDemo]# ab=1
[root@hadoop61 shellDemo]# 
  1. 显示变量值使用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
exit
2、环境变量
  • 简介:自定义的环境变量对当前shell进程及其子shell进程有效,对其他的shell进程无效
  • 定义:export x=y (定义临时的环境变量)
  • 注:
    (1)对所有shell进程都有效需要配置到配置文件中 (定义永久的环境变量)
    vi /etc/profile
    source /etc/profile
    (2)相当于java中的protected修饰符,对当前类,子孙类,以及同一个包下面可以共用。
    (3)和Windows中的环境变量比较类似
3、位置变量
  • 写法:$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开始的,后面有几个参数,就有 $几。
4、特殊变量 (1)$?:接收上一条命令的返回状态码(返回状态码在0-255之间)
如果上一条命令执行成功,返回的状态码就是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规范外的退出状态
(2)$#:参数个数
  • 编辑脚本 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’ "
1、echo’x’ :单引号不解析变量

简介:直接原样输出

[root@hadoop61 shellDemo]# echo '$Java_HOME'
$Java_HOME
2、echo"x":双引号会解析变量

简介 :获取具体路径

[root@hadoop61 shellDemo]#  echo "$JAVA_HOME"
/data/soft/jdk1.8
3、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'
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/318238.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号