Shell编程学习(一)简单介绍和执行shell脚本的方式

Shell编程是什么?为什么要学习Shell?

首先我们要知道,我们的Java项目一般都是部署到Linux系统上的,这是由于Linux相对于Windows而言呢有一下几点:

  • 开源,可以修改定制和再发布。
  • 安全性更高
  • 虽然windows有很友好的可视化界面,但是者也导致了它效率低,至少没有linux系统效率高。但是linux系统大部分基于命令行的操作,入门有一定的困难。

我们使用linux操作系统,就要使用shell语言对linux系统的内核进行操作,外层应用程序通过调用shell程序从而对linux系统进行操作。
在这里插入图片描述

Shell实际上就是一个命令行的解释器,Linux提供的Shell解析器有下面几个,我们通过/etc/shells文件可以看到:

[root@iZwz9hv1phm24s3jicy8x1Z /]# cat etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

查看我们系统使用的shell解析器

[root@iZwz9hv1phm24s3jicy8x1Z /]# ls -l /bin/ |grep bash
-rwxr-xr-x  1 root root  1182848 May 28  2021 bash
lrwxrwxrwx  1 root root       10 May 28  2021 bashbug -> bashbug-64
-rwxr-xr-x  1 root root     7343 May 28  2021 bashbug-64
lrwxrwxrwx  1 root root        4 May 28  2021 sh -> bash

直接寻找一个当前的环境变量也可以查看你我们的系统使用的shell解析器

[root@iZwz9hv1phm24s3jicy8x1Z /]# echo $SHELL
/bin/bash

shell的基本语法

脚本的格式

  • 我们随便打开一个系统中的.sh文件可以发现第一行#! /bin/sh,这是指定shell脚本的解析器。

尝试自己写一个shell脚本

  • 创建一个文件hello.sh,编写脚本
root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# touch hello.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim hello.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ls
hello.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat hello.sh 
#!/bin/bash
echo "hello world!"

执行shell脚本

  • sh或者bash命令加上脚本的绝对路径或者相对路径即可
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sh ./hello.sh 
hello world!
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sh hello.sh 
hello world!
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# pwd
/home/dongmu/shellStudy
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash /home/dongmu/shellStudy/hello.sh 
hello world!
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sh /home/dongmu/shellStudy/hello.sh 
hello world!

  • 有关第二种执行的方式,我们先扩展了解一下linux的其他知识点。

Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。

我们可以通过ls -l这个命令来查看文件的属性,所属的用户和组。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ls -l
total 4
-rw-r--r-- 1 root root 32 Apr 20 19:44 hello.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# mkdir test
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ls -l
total 8
-rw-r--r-- 1 root root   32 Apr 20 19:44 hello.sh
drwxr-xr-x 2 root root 4096 Apr 20 19:59 test

这个‘文件’的属性的第一个字母,如果是-则表示这是一个文件
如果是d则表示这是一个目录,如果l则是一个链接,
如果是其他的,代表其他的内容,这里就不细说了。
这里可以参考

接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。
其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。
要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
每个文件的属性由左边第一部分的10个字符来确定(如下图):
在这里插入图片描述

chmod 命令可以给我们的文件属性进行修改,
比如chmod 777 文件名 意思就是这个文件的主组属组其他用户都有可读可写可执行的权力。

我们首先修改这个文件的属性,改成可执行的状态。

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# chmod 770 hello.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ls -l
total 8
-rwxrwx--- 1 root root   32 Apr 20 19:44 hello.sh
drwxr-xr-x 2 root root 4096 Apr 20 19:59 test

然后直接执行即可

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ./hello.sh 
hello world!
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# /home/dongmu/shellStudy/hello.sh 
hello world!
  • 第三种方式
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# touch third.sh
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# vim third.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# cat third.sh 
#!/bin/bash
A=5
echo $A
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash third.sh 
5
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sh th
sh: th: No such file or directory
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# sh third.sh 
5
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ./third.sh 
-bash: ./third.sh: Permission denied
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# chmod 770 third.sh 
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ./third.sh 
5

直接使用下面的方式
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# . third.sh 
5
注意这个.也是个命令。这种方式和./third.sh是完全不同的执行方式
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# echo $A
5
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# source third.sh 
5

为什么第一种方式不需要呢?
因为第一种方式是把文件当成参数传递给新启动的一个子bash线程,而第二种和第三种是直接在当前线程中执行文件,所以要有可执行权限。
这两种不同的形式有什么区别呢?
第一种可能会导致子线程修改的东西在父线程中是不生效的。还是有一定区别了。
开子 shell 与不开子 shell 的区别就在于,环境变量的继承关系,如在子 shell 中设置的 当前变量,父 shell 是不可见的。

查看父子线程

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
root      919071  919068  0 19:30 pts/0    00:00:00 -bash
root      924432  919071  0 20:46 pts/0    00:00:00 ps -f

bash命令是直接启动一个bash线程
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash

[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
root      919071  919068  0 19:30 pts/0    00:00:00 -bash
root      924439  919071  0 20:46 pts/0    00:00:00 bash 可以发现这个线程是-bash线程的子线程
root      924466  924439  0 20:46 pts/0    00:00:00 ps -f

关闭进程
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# kill -9 924439
Killed
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
root      919071  919068  0 19:30 pts/0    00:00:00 -bash
root      924694  919071  0 20:50 pts/0    00:00:00 ps -f


我们开启一个bash之后,exit之后并没有退出虚拟机,而是退出了一个线程,类似于套娃
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# bash
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# exit
exit
[root@iZwz9hv1phm24s3jicy8x1Z shellStudy]# ps -f
UID          PID    PPID  C STIME TTY          TIME CMD
root      919071  919068  0 19:30 pts/0    00:00:00 -bash
root      924807  919071  0 20:52 pts/0    00:00:00 ps -f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海冥鱼未眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值