@[toc]
如果想看更详细的Shell总结请到我之前写的博客https://blog.csdn.net/Redamancy06/article/details/126048299
1.Shell 概述
Shell是一个命令行解释器
,他接受应用程序/用户命令,然后调用操作系统内核
Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强
1.1Linux 提供的 Shell 解析器有
[root@hadoop100 ~]# cat /etc/shells
ubuntu使用的解析器是dash
1.2bash 和 sh 的关系
- [root@hadoop100 ~]# ls -l /bin/ | grep bash
1.3Centos 默认的解析器是 bash
[root@hadoop100 ~]# echo $SHELL
2.Shell 脚本入门
2.1脚本格式
脚本以#!/bin/bash
开头(指定解析器)
2.2第一个 Shell 脚本:helloworld.sh
一般情况下加上.sh后缀,也可以不加.sh后缀
2.2.1需求
创建一个 Shell 脚本,输出 helloworld
2.2.2实践
先创建一个目录scripts(可以不创建,我这里为了好管理,又重新创建了一个目录),然后进入该目录,在目录里创建一个hello.sh的文件,进行编辑
[root@hadoop100 ~]# mkdir scripts
[root@hadoop100 ~]# cd scripts/
[root@hadoop100 scripts]# touch hello.sh
[root@hadoop100 scripts]# vim hello.sh
在hello.sh中写如下代码
!/bin/bash
echo "hello,world"
2.3脚本的常用执行方式
2.3.1第一种:采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)
2.3.1.1sh+脚本的相对路径
[root@hadoop100 scripts]# sh ./hello.sh
2.3.1.2sh+脚本的绝对路径
[root@hadoop100 scripts]# sh /root/scripts/hello.sh
2.3.1.3bash+脚本的相对路径
[root@hadoop100 scripts]# bash ./hello.sh
2.3.1.4bash+脚本的绝对路径
[root@hadoop100 scripts]# bash /root/scripts/hello.sh
2.3.2第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
2.3.2.1首先要赋予 helloworld.sh 脚本的+x 权限
[root@hadoop100 scripts]# chmod +x hello.sh
2.3.2.2执行脚本
2.3.2.2.1相对路径
[root@hadoop100 scripts]# ./hello.sh
[root@hadoop100 scripts]# hello.sh如果直接这样敲的话就会被认为是一条命令去执行
2.3.2.2.1绝对路径
[root@hadoop100 scripts]# /root/scripts/hello.sh
2.3.3注意
第一种执行方法,本质是 bash 解析器帮你执行脚本,所以脚本本身不需要执行 权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
2.3.4第三种:在脚本的路径前加上“.”或者 source(了解)
2.3.4.1 source命令绝对路径
2.3.4.2source命令相对路径
2.3.4.3 “.”命令绝对路径
2.3.4.4 “.”命令相对路径
2.3.4.5注意
这两个的区别在于第一个“.”是命令,而下面那个表示的是相对路径,因为“.”第三种情况是使脚本内容在当前 shell 里执行,所以不用加/来表示相对路径,而第一种和第二种是打开一个子 shell 来执行脚本内容,所以需要加./来表示相对路径
2.3.7子shell
相当于嵌套for循环,子shell的变量在父shell里面不能用,如果退出的话是先从最内层退出,然后再到最外层,相当于在在for循环里面写break,是一层一层的退出
2.3.6一般使用第二种方式执行脚本语言
2.3.6.1如果把要执行的脚本放到系统命令里(bin目录或者sbin目录)
但是这种情况不靠谱,因为这个目录里面是系统的命令,因此不要轻易更改
2.3.6.2更改环境变量
可以通过更改环境变量来直接执行脚本,可以将hello.sh放到/root/bin里面,或者直接将scripts目录放到环境变量里也可以
2.3.7总结
原因: 前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则 子 shell 关闭,回到父 shell 中。
第三种,也就是使用在脚本路径前加“.”或者 source 的方式,可以使脚本内容在当前 shell 里执行,而无需打开子 shell!
这也是为什么我们每次要修改完/etc/profile 文件以后,需 要 source 一下的原因。
开子 shell 与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell 中设置的 当前变量,父 shell 是不可见的。
比如 更改linux中的.profile配置文件,发现没有及时生效,然后直接source 改过的文件,所有更改的环境配置文件都生效了
如果想看更详细的Shell总结请到我之前写的博客http://t.csdn.cn/cQArA