Shell概述
Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核
Shell还是一个功能强大的编程语言,易编写,易调试,灵活性强
Shell解析器
Linux提供的Shell解析器
# Linux中shell解析器
[root@hadoop-slave01 mnt]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
bash和sh的关系
# 从结果来看sh是bash的软引用
[root@hadoop-slave01 /bin]# ll | grep bash
-rwxr-xr-x. 1 root root 964600 8月 8 2019 bash
lrwxrwxrwx. 1 root root 10 1月 20 2020 bashbug -> bashbug-64
-rwxr-xr-x. 1 root root 6964 8月 8 2019 bashbug-64
lrwxrwxrwx. 1 root root 4 1月 20 2020 sh -> bash
Centons和Ubuntu某版本的解析器
# 查看linux发行版本(适合所有的Linux) --> 1
[root@hadoop-master bin]# cat /etc/issue
\S
Kernel \r on an \m
# 查看linux发行版本(只适合Redhat系的Linux) --> 2
[root@hadoop-master ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
# 查看linux内核 --> 1
[root@hadoop-master ~]# cat /proc/version
Linux version 3.10.0-1062.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Wed Aug 7 18:08:02 UTC 2019
# 查看linux内核 --> 2
[root@hadoop-master bin]# uname -a
Linux hadoop-master 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
# 查看解析器
[root@hadoop-master ~]# echo $SHELL
/bin/bash
##-----------------------------------------
# Ubuntu 版本
root@phm2-storage03:~# cat /etc/issue
Ubuntu 16.04.5 LTS \n \l
# Ubuntu 解析器
root@phm2-storage03:~# echo $SHELL
/bin/bash
Shell 脚本入门
固定格式
脚本以 #!/bin/bash 开头(指定解析器)
PS: 目前在一些系统中不以该固定格式开头也能正常执行
执行方式
1、通常以sh或bash 加脚本的相对路径或绝对路径执行(不需要脚本具备可执行权限)
2、赋予脚本+x权限以相对路径或者是绝对路径执行
PS:
第一种执行方法,本质是bash解析器来执行脚本,所以脚本本身不需要执行权限。
第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
第一个脚本
新建一个文件
[root@hadoop-slave01 /mnt]# vi hello.sh
#!/bin/bash
echo "current path is $PWD"
通过sh 执行
# 执行之后输出当前目录结果
[root@hadoop-slave01 /mnt]# sh hello.sh
current path is /mnt
通过./hello.sh执行
# 先分配可执行权限
[root@hadoop-slave01 /mnt]# chmod 777 hello.sh
# 分配之后变成可执行的文件
[root@hadoop-slave01 /mnt]# ll
总用量 12
-rwxrwxrwx 1 root root 42 10月 14 17:05 hello.sh
# 执行结果
[root@hadoop-slave01 /mnt]# ./hello.sh
current path is /mnt
Shell中的变量
常用系统变量
# 当前home
[root@hadoop-slave01 /mnt]# echo $HOME
/root
# 当前路径
[root@hadoop-slave01 /mnt]# echo $PWD
/mnt
# 使用Shell解析器
[root@hadoop-slave01 /mnt]# echo $SHELL
/bin/bash
# 当前登录用户
[root@hadoop-slave01 /mnt]# echo $USER
root
显示当前Shell中所有的变量
# 通过set命令获取shell中所有的变量信息
[root@hadoop-master bin]# set
ABRT_DEBUG_LOG=/dev/null
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_REMATCH=()
BASH_SOURCE=()
自定义变量
变量定义规则
1、变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
2、等号两侧不能有空格
3、在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
4、变量的值如果有空格,需要使用双引号或单引号括起来
案例实操
# 声明变量DEMO
[root@hadoop-master bin]# DEMO=13
# 输出变量DEMO
[root@hadoop-master bin]# echo $DEMO
13
# 重新赋值
[root@hadoop-master bin]# DEMO=23
# 重新输出值(变量值已经改变了)
[root@hadoop-master bin]# echo $DEMO
23
# 撤销赋值
[root@hadoop-master bin]# unset DEMO
# 此时再输出变量值就为空了
[root@hadoop-master bin]# echo $DEMO
# 只读变量不能重新赋值
[root@hadoop-master bin]# readonly READ=88
[root@hadoop-master bin]# echo READ
READ
[root@hadoop-master bin]# READ=99
bash: READ: 只读变量
# shell中都是字符串不能直接进行数值运算
[root@hadoop-master bin]# echo $READ+$DEMO
88+23
# 可通过以下方式进行数学运算
[root@hadoop-master bin]# echo $[$READ+$DEMO]
101
[root@hadoop-master bin]# echo $(($READ+$DEMO))
101
特殊的变量
$n
功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10},常用语获取参数
$#
功能描述:获取所有输入参数个数,常用于循环
$*
功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@
功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$?
功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
案例实操
编写shell脚本文件paramter.sh
#!/bin/bash
# 输出脚本名称和前两个参数
echo '$n --> '"input params: $0 $1 $2"
# 输出参数个数
echo '$# --> '"parameter counts $#"
# 输出所有参数
echo '$* --> '"一个整体:$*"
# 输出所有参数
echo '$@ --> '"每个参数区分对待: $@"
执行结果
# 执行结果
[root@hadoop-slave01 mnt]# ./parameter.sh 1 2 3 4 5 6
$n --> input params: ./parameter.sh 1 2
$# --> parameter counts 6
$* --> 一个整体:1 2 3 4 5 6
$@ --> 每个参数区分对待: 1 2 3 4 5 6
未完待续