目录
方式一:采用 bash / sh + 脚本的相对路径或绝对路径(脚本无需可执行( +x )权限)
方式二:直接输入脚本的绝对路径或相对路径执行脚本(要求脚本必须具有可执行权限+x)
方式三:在脚本的路径前加上“.”或者 source 执行脚本
1、shell概述
- shell 是一个命令解释器,它接收应用程序/控制台命令。然后调用操作系统内核
- shell 是一个功能强大的编程(脚本)语言,易编写、易调试、灵活性强
1.1、查看Linux 提供的 Shell 解析器
- 命令:cat /etc/shells
1.2、bash 和 sh 的关系
- 命令:ls -l /bin/sh
1.3、查看系统(centos)默认使用的解释器
- 命令:echo $SHELL
2、脚本的基础使用
2.1、脚本的格式
- shell 脚本一般已 .sh 后缀命名以示区别
- shell 脚本内容以 #!/bin/bash 或 #!/bin/sh 开头 (指定解释器)
2.2、脚本的执行方式
方式一:采用 bash / sh + 脚本的相对路径或绝对路径(脚本无需可执行( +x )权限)
- 说明:本质是 bash 解析器帮你执行脚本,所以脚本本身不需要执行 权限
2.2.1、bash + 脚本的相对路径
- 命令:bash test.sh 或 bash ./test.sh 等价于 sh test.sh 或 sh ./test.sh
2.2.2、bash + 脚本的绝对路径
- 命令:bash /home/testhadoop/test/scripts/test.sh 或 sh /home/testhadoop/test/scripts/test.sh
方式二:直接输入脚本的绝对路径或相对路径执行脚本(要求脚本必须具有可执行权限+x)
- 说明:本质是脚本需要自己执行,所以需要执行权限。
2.2.3、给目标文件 tesh.sh 添加可执行权限
- 命令:chmod +x test.sh 或者 chmod 755 test.sh
2.2.4、使用相对路径执行脚本
- 命令:./test.sh
- 注意:使用相对路径执行只能使用 ./test.sh 的方式执行,直接使用 test.sh 不能执行 ,因为test.sh 并没有添加到环境变量PATH里面,所以不能执行。
2.2.5、使用绝对路径执行脚本
- 命令:/home/testhadoop/test/scripts/test.sh
方式三:在脚本的路径前加上“.”或者 source 执行脚本
- 命令: . test2.sh 或 source test2.sh
现象:
- 可以看出使用方式一和方式二执行,执行完成后在当前shell下使用命令:echo $test_var 得到变量test_var的值为空,而使用方式三执行脚本,执行完成后,可在当前的shell下获取到变量test_var的值。
原因:
- 方式一和方式二,在当前的shell中打开了一个子shell来执行脚本内容,脚本执行结束,子shell关闭,回到父shell中(即当前的shell中)
- 方式三,执行脚本是直接在当前的shell中执行的,没有开启子shell进程,这也是为什么我们每次在修改完/etc/profile 文件以后,需要使用 source 执行一下文件的原因。
区别:
- 开子 shell进程 与不开子 shell 进程的区别就在于,环境变量的继承关系,子shell进程可以继承父shell进程的变量,而父shell进程不可见子shell进程的变量。
- 注意:修改变量值只对当前shell以及其子shell生效,对父shell之上的层级不生效,包括修改全局变量。
2.3、Linux 中的单引号、双引号、反引号
2.3.1、单引号
说明:单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用,需要注意的是它不允许引用自身,即单引号内部不允许嵌套单引号。
单引号把其中的内容全部当做字符串处理,忽略内部所有的命令和特殊字符。
示例:
2.3.2、双引号
说明:双引号属于弱引用,它会对一些被引起来的字符进行特殊处理。
区别:双引号与单引号的区别在于其可以包含特殊字符(单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符);如果要忽略特殊字符,就可以利用\来转义,忽略特殊字符,作为普通字符输出。
示例:
2.3.3、反引号
说明:用来包含一个命令字符串,其中的命令会先执行,得到的结果会返回到当前层其他命令再执行;其作用与$(command)类似。
示例:遍历当前文件夹及其一级子文件夹的详细信息
3、变量
变量分类:
根据变量使用范围分为:
- 全局变量
- 局部变量
根据定义类型分为:
- 系统变量
- 自定义变量
3.1、系统预定义变量
1、常用系统变量
- PATH、HOME、SHELL、USER
- 注意:系统变量都是大写,自定义变量大小写不做要求,一般是小写。
2、常用操作
(1)查看系统变量的值
- 方式:$系统变量名
如:查看系统变量HOME的值
- echo $HOME
(2) 查看系统环境变量
- 命令:env
(3) 查看当前shell中所有的变量,包括临时变量、自定义变量
- 命令:set
3.2、自定义变量
3.2.1、基本语法
- 定义变量:变量名=变量值;注意:=号前后不能有空格
- 撤销/删除变量:unset 变量名
- 声明静态变量:readonly 变量名; 注意:不能使用unset删除
- 把局部变量变成全局变量:export 变量名
3.2.2、变量定义规则
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头;环境变量建议全部大写
- 中间不能有空格,可以使用下划线_
- 不能使用标点符号
- 不能使用bash里的关键字(可以用help命令查看保留关键字)
- 等号两侧不能有空格
- 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
- 变量的值如果有空格,需要使用双引号或单引号括起来
3.3、特殊变量
3.3.1、$n
功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,超过十个以 上的参数,需要用大括号包含,如${10}。
示例:
3.3.2、$#
功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及 加强脚本的健壮性
示例:
3.3.3、$* 与 $@
$* 功能描述:代表命令行中所有的参数,$* 不被双引号“”包含时,把每个参数单独区分,可对每个参数进行遍历;被双引号“”包含时,把所有的参数看成一个整体
$@ 功能描述:代表命令行中所有的参数,$@ 把每个参数单独区分,可对每个参数进行遍历
示例:
3.3.4、$?
功能描述:查看最后一次执行的命令的返回状态。
- 如果这个变量的值为 0,证明上一 个命令正确执行;
- 如果这个变量的值为非 0(具体值,由命令自己来决定),则证明 上一个命令执行有误。
示例: