了解什么是shell
Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程序。shell通过提示你输入,向操作系统解释该输入,然后处理来自操作的任何结果输出管理你与操作系统之间的交互。吉纳丹来说Shell就是一个用户跟操作系统之间的一个命令解释器
其中在终端中输入echo $BASH
显示文间的BASH的路径
当输入 df -h
显示系统的分区信息
Shell是用户与Linux操作系统之间沟通的桥梁,用户可以输入命令执行,又可以利用Shell脚本编程去运行。
Linux Shell种类非常多,常见的有:Bourne Shell (/usr/bin/sh或/bin/sh),Bourne Again Shell(/bin/bash)等,这里就不介绍这么多了。不同的Shell语言的语法有所不同,所以不能交互使用
最常见的Shell是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常生活中被广泛使用,也是大多数Linux系统默认的Shell。接下来先写一个简单的shell脚本。(shell脚本一般文件名以.sh结尾,同时文件第一行定义该脚本为shell脚本)
vi first_shell.sh
#!/bin/bash
#This is my First shell
echo “Hello World !”
这就是我们的第一个脚本,注解如下:
#!/bin/bash
表示定义该脚本是一个shell脚本(固定格式)
#This is my First shell
这里的#号属于注解,没有任何意义,Shell不会解析它
echo “Hello World !”
shell脚本主命令,我们执行这个脚本将看到:Hello World !信息
脚本编写完毕,如何执行呢,首先执行shell脚本需要执行权限
赋予执行权限:
chmod o+x first_shell.sh 然后./first_shell.sh执行即可:也可以直接使用命令执行, /bin/bash first_shell.sh,显示效果是一样的。
Shell变量
Shell编程语言是非类型的解释型语言,不像C++/Java语言编程时需要实先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号为变量赋值
SHELL变量分两类:局部变量和环境变量,局部变量只能创建他们的shell脚本中使用。而环境变量则可以咋创建他们的shell及其派生的任意子进程中使用,有些变量是用户创建的,其它的则是专用shell变量。
1.常用的系统变量
H
O
M
E
、
HOME、
HOME、PWD、
S
H
E
L
L
、
SHELL、
SHELL、USER等
set可以显示所有的变量
2自定义变量
定义变量:变量=值
撤销变量:unset 变量
声明静态变量:readonly变量,注意:不能unset
规定:
变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
等号两侧不能有空格
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
变量的值如果有空格,需要使用双引号或单引号括起来
例子:
定义变量A
[jinghnag@hadoop101 datas]$ A=5
[jinghnag@hadoop101 datas]$ echo $A
5
给变量A重新赋值
[jinghnag@hadoop101 datas]$ A=8
[jinghnag@hadoop101 datas]$ echo $A
8
撤销变量A
[jinghnag@hadoop101 datas]$ unset A
[jinghnag@hadoop101 datas]$ echo $A
声明静态的变量B=2,不能unset
[jinghnag@hadoop101 datas]$ readonly B=2
[jinghnag@hadoop101 datas]$ echo
B
2
[
j
i
n
g
h
n
a
g
@
h
a
d
o
o
p
101
d
a
t
a
s
]
B 2 [jinghnag@hadoop101 datas]
B2[jinghnag@hadoop101datas] B=9
-bash: B: readonly variable
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
[jinghnag@hadoop101 ~]$ C=1+2
[jinghnag@hadoop101 ~]$ echo $C
1+2
变量的值如果有空格,需要使用双引号或单引号括起来
[jinghnag@hadoop101 ~]$ D=I love banzhang
-bash: world: command not found
[jinghnag@hadoop101 ~]$ D=“I love banzhang”
[jinghnag@hadoop101 ~]$ echo $D
I love banzhang
可把变量提升为全局环境变量,可供其他Shell程序使用
export 变量名
[jinghnag@hadoop101 datas]$ vim helloworld.sh
在helloworld.sh文件中增加echo $B
#!/bin/bash
echo “helloworld”
echo $B
[jinghnag@hadoop101 datas]$ ./helloworld.sh
Helloworld
发现并没有打印输出变量B的值。
[jinghnag@hadoop101 datas]$ export B
[jinghnag@hadoop101 datas]$ ./helloworld.sh
helloworld
2
接下来几个特别的变量:
$n
功能描述:n为数字,$0代表该脚本名称,$1-
9
代
表
第
一
到
第
九
个
参
数
,
十
以
上
的
参
数
,
十
以
上
的
参
数
需
要
用
大
括
号
包
含
,
如
9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如
9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10}
$#
获取所有输入参数个数,常用于循环
∗ 、 *、 ∗、@
∗ ( 功 能 描 述 : 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , * (功能描述:这个变量代表命令行中所有的参数, ∗(功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体)
@ ( 功 能 描 述 : 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @ (功能描述:这个变量也代表命令行中所有的参数,不过 @(功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待)
$?
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)