文章目录
一、Shell概述
Shell是一个命令行解释器,它接收应用程序或者用户命令,然后调用操作系统内核。
Shell是一个功能相当强大的编程语言,易编写、易调试、灵活性强。
Shell 脚本(shell script)是一种为 shell 编写的脚本程序。常说的shell通常都是指 shell 脚本,但shell和shell script是两个不同的概念。通常说“shell编程”都是指 shell 脚本编程,不是指开发 shell 自身。
大数据程序员为什么要学习Shell呢?
- 需要看懂运维人员编写的Shell程序
- 偶尔会编写一些简单Shell程序来管理集群、提高开发效率
二、Shell解释器
Linux提供的Shell解释器有:
[root@iZ2ze436suxwekgjxx28iaZ ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
sh(Bourne Shell)是一个早期的重要shell,遵循POSIX规范:即“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。
sh 跟bash的区别实际上是:有没开启POSIX模式的区别。
简单说,sh是bash的一种特殊的模式,sh就是开启了POSIX标准的bash
Centos默认的Shell解释器是bash。
三、Shell脚本入门
3.1 脚本格式
脚本以#!/bin/bash开头(指定解析器)
- #!是一个特殊标记,说明这是一个可执行的脚本。除了第一行,其他以#开头的都不再生效,为注释。
- #!后面是脚本的解释器程序路径。这个程序可以是shell,程序语言或者其他通用程序,常用的是bash、sh。
3.2 第一个Shell脚本:helloworld
[root@iZ2ze436suxwekgjxx28iaZ shell]# touch helloworld.sh
[root@iZ2ze436suxwekgjxx28iaZ shell]# vim helloworld.sh
在helloworld.sh中输入如下内容
#!/bin/bash
echo "helloworld"
执行方式:
第一种:采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
bash helloworld.sh
sh helloworld.sh
bash /home/liuxingyu/shell/helloworld.sh
sh /home/liuxingyu/shell/helloworld.sh
第二种:采用输入脚本的绝对路径或相对路径执行脚本**(必须具有可执行权限+x)**
[root@iZ2ze436suxwekgjxx28iaZ shell]# chmod 777 helloworld.sh
[root@iZ2ze436suxwekgjxx28iaZ shell]# ./helloworld.sh
注意:
第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
3.3 第二个Shell脚本:多命令处理
在/home/liuxingyu/shell目录下创建一个banzhang.txt,在banzhang.txt文件中增加“I love cls”:
[root@iZ2ze436suxwekgjxx28iaZ shell]# touch batch.sh
[root@iZ2ze436suxwekgjxx28iaZ shell]# vim batch.sh
在helloworld.sh中输入如下内容
#!/bin/bash
cd /home/liuxingyu/shell
touch banzhang.txt
echo "i love cls" >> banzhang.txt
四、Shell中的变量
4.1 常用系统变量
$HOME、$PWD、$SHELL、$USER等
查看系统变量的值:
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $HOME
/root
You have new mail in /var/spool/mail/root
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $PWD
/home/shell
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $SHELL
/bin/bash
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $USER
root
显示当前Shell中所有变量:
[root@iZ2ze436suxwekgjxx28iaZ shell]# set
BASH=/bin/bash
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
4.2 自定义变量
1、基本语法
(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明静态变量:readonly 变量,注意:不能unset
2、变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
3、举例
定义变量、取变量值输出、撤销变量:
[root@iZ2ze436suxwekgjxx28iaZ shell]# A=8
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $A
8
[root@iZ2ze436suxwekgjxx28iaZ shell]# unset A
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $A
声明静态变量(静态变量不能unset,不能更改):
[root@iZ2ze436suxwekgjxx28iaZ shell]# readonly B=2
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $B
2
[root@iZ2ze436suxwekgjxx28iaZ shell]# B=9
-bash: B: readonly variable
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算:
[root@iZ2ze436suxwekgjxx28iaZ shell]# C=1+2
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $C
1+2
变量的值如果有空格,需要使用双引号或单引号括起来:
[root@iZ2ze436suxwekgjxx28iaZ shell]# D=I love banzhang
-bash: world: command not found
[root@iZ2ze436suxwekgjxx28iaZ shell]# D="I love banzhang"
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $A
I love banzhang
可把变量提升为全局环境变量,可供其他Shell程序使用:
语法是:export 变量名
[root@iZ2ze436suxwekgjxx28iaZ shell]# vim helloworld.sh
在helloworld.sh文件中增加echo $B
#!/bin/bash
echo "helloworld"
echo $B
[root@iZ2ze436suxwekgjxx28iaZ shell]# ./helloworld.sh
Helloworld
这时发现并没有打印输出变量B的值。因此,使用 export B
,把变量B提升为全局环境变量,再次执行helloworld.sh,发现成功打印输出了B的值。
[root@iZ2ze436suxwekgjxx28iaZ shell]# export B
[root@iZ2ze436suxwekgjxx28iaZ shell]# ./helloworld.sh
helloworld
2
4.3 特殊变量 $n
1、基本语法$n
功能描述:n为数字,$0代表该脚本名称,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}
2、举例
输出该脚本文件名称、输入参数1 和输入参数2 的值:
[root@iZ2ze436suxwekgjxx28iaZ shell]# touch parameter.sh
[root@iZ2ze436suxwekgjxx28iaZ shell]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
[root@iZ2ze436suxwekgjxx28iaZ shell]# chmod 777 parameter.sh
[root@iZ2ze436suxwekgjxx28iaZ shell]# ./parameter.sh cls xz
./parameter.sh cls xz
4.4 特殊变量 $#
1、基本语法$#
功能描述:获取所有输入参数个数,常用于循环
2、案例实操
获取输入参数的个数
[root@iZ2ze436suxwekgjxx28iaZ shell]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
[root@iZ2ze436suxwekgjxx28iaZ shell]# chmod 777 parameter.sh
[root@iZ2ze436suxwekgjxx28iaZ shell]# ./parameter.sh cls xz
parameter.sh cls xz
2
4.5 特殊变量$*、$@
1、基本语法
$*
:功能描述:这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体
$@
:功能描述:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待
2、案例实操
打印输入的所有参数
[root@iZ2ze436suxwekgjxx28iaZ shell]# vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[root@iZ2ze436suxwekgjxx28iaZ shell]# bash parameter.sh 1 2 3
parameter.sh 1 2
3
1 2 3
1 2 3
4.6 特殊变量$?
1、基本语法$?
功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
2、案例实操
判断helloworld.sh脚本是否正确执行
[root@iZ2ze436suxwekgjxx28iaZ shell]# ./helloworld.sh
hello world
[root@iZ2ze436suxwekgjxx28iaZ shell]# echo $?
0