Shell 脚本的详细解读 (一)

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

 未完待续

你可能感兴趣的:(linux,高性能编程,shell,linux)