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

2023-11-14

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 在 bash 脚本中提取 XML 值 [重复]

    这个问题在这里已经有答案了 我正在尝试从 xml 文档中提取一个值 该文档已作为变量读入我的脚本中 原始变量 data is
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 需要一些建议来开始在 ARM(使用 Linux)平台上编程

    我 也许 很快就会在托管 Linux 发行版的 ARM 平台上工作 我不知道哪个发行版 我知道该项目涉及视频流 但我无法告诉你更多信息 其实我只收到通知 还没见到任何人 我从来没有在这样的平台上工作过 所以我的想法是在项目开始之前进行测试
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta

随机推荐

  • 解决网页无法选中文字,无法复制的问题

    今天在CSDN浏览网页的时候发现有一些文章无法复制文字 查找解决方式 找到一个可行的方式 1 将网页保存到本地 保存为一个单网页 2 使用文本编辑工具打开网页文件 找到以下字段 content views user select none
  • 网络安全之端口扫描

    1 扫描三步曲 一个完整的网络安全扫描分为三个阶段 第一阶段 发现目标主机或网络 端口扫描 第二阶段 发现目标后进一步搜集目标信息 包括操作系统类型 运行的服务以及服务软件的版本等 如果目标是一个网络 还可以进一步发现该网络的拓扑结构 路由
  • java使用aspose-words无损格式转pdf文件

    1 下载aspose wordsjar包 链接 https pan baidu com s 1Dtb hFgYJj2 F Ona8nErQ 提取码 kdrb 2 项目pom xml配置以下代码 执行下载jar包 这个时候肯定是下载不下来的
  • 美团某程序员哀叹:能力很强,却因为不会“向上管理”而惨遭被裁!怎么办?...

    互联网大厂大多有自己的绩效考核机制 比如 361 271 等 美团实行的绩效考核机制就是 271 即20 的人是A类绩效 70 的人是B类绩效 10 的人是C类绩效 那么这个绩效是如何评定的呢 是唯技术论还是有其他因素 评定过程中是否存在不
  • Linux——TCP编程流程

    TCP编程流程 TCP是传输层的一种协议 提供的是面向连接 可靠的 字节流的服务 主机字节序和网络字节序 主机字节序列分为大端字节序和小端字节序 不同的主机采用的字节序列可能不同 不同的芯片 所采用的数值存储方式是不同 大端字节序是指一个整
  • SQL server 导入Excel数据

    SQL server 导入Excel数据 编辑 洪伟富 2018 06 07 第一步 对表格数据的处理 这一列数据中有数字 又有中文 如果不做处理 导入数据库会默认为float 从而导致 公教楼201 等字符全部为null 解决办法 用筛选
  • 从键盘上输入身份证号, 判断出生日期,性别

    从键盘上输入身份证号 判断出生日期 性别 倒数第二位是奇数表示男 偶数代表女 public class IdNumber public static void main String args 1 键盘输入身份证号 Scanner intp
  • qt 导出word中插入图片

    QAxObject selection m word gt querySubObject Selection QVariantList params params append 6 params append 0 selection gt
  • 手把手教YOLO系列算法部署之安卓部署

    前言 首先我的yolov5的版本是v6 1 我的部署方式是将模型先转为tflite然后部署到安卓上 大家一般是使用自己的训练模型权重文件来部署 所以我直接讲述自定义模型的部署检测 链接 https pan baidu com s 1bskq
  • shouldComponentUpdate有什么作用

    shouldComponentUpdate有什么作用 shouldComponentUpdate是生命周期之一 是不常用的一个方法 能影响组件是否重新渲染 在更新阶段 当有了new props或者调用setState 方法 在render方
  • Mathorcup数学建模竞赛第三届-【妈妈杯】B题:关于三维健康评分模型的研究(附带赛题解析&获奖论文)(一)

    赛题描述 由于现代社会的生活节奏加快 生活工作压力增大 拥有一个健康的身体显得尤为重要 健康的标准有很多 但是如何量化这些标准 评价一个人的健康状况是一个比较困难的问题 世界卫生组织给出的健康标准有如下几个 1 精力充沛 能从容不迫地应付日
  • 【react】props的基本使用

    props可以用来组件传值 render里面的this指向Person的实例对象 而实例对象上有一个属性props 可以用他来给组件传值 class Person extends React Component render const n
  • SpringCloud——Gateway和过滤器和跨域问题的解决

    介绍 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目 该项目是基于 Spring 5 0 Spring Boot 2 0 和 Project Reactor 等响应式编程和事件流技术开发的网关 它旨在
  • LeetCode(20):有效的括号

    描述 给定一个只包括 的字符串 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 示例 输入 输出 true 输入 输出 true 输入 输出 true 输
  • 从ubuntu18 升级到ubuntu20 墙倒屋塌,重新开始

    升级到20 发现了各种不便 最主要是我的机器就是这个运行水平 不能再往上跟了 运行慢将不可容忍 启动慢 不可容忍 点击icon 有几秒种不响应期 难以容忍 与vmware虚拟机15不能很好兼容 并进一步不能与win7兼容 win7我认为是最
  • 基于线性回归对神经网络的解释以及梯度下降鞍点与局部最优的产生原理

    首先 机器学习的本质是让计算机找到一个函数来解决问题 这种函数非常复杂以至于人类无法直接手写出来 本文参考李宏毅教授视频ML 2021 Spring 神经网络是解决线性不可分问题 你可以引入多条线来分割当然我们也可以引入激活函数 非线性函数
  • 计算机视觉小项目—基于RGB颜色特征的火焰识别

    提出问题 随着计算机视觉及图像处理技术的发展 基于计算机视觉的火焰检测技术逐渐取代了传统的火灾检测 由于火焰最显著静态特质是其颜色 火焰识别算法主要利用视频图像中颜色与亮度的相关信息 所以对火焰颜色的特征提取是火焰识别过程的关键 在有关火焰
  • Spring Cloud Ribbon无法将服务名转换为地址

    试了许多网上说的 都不管用 后来发现是spring cloud starter eureka依赖项的版本问题 将版本降低后正常运行
  • fileclude(文件包含漏洞及php://input、php://filter的使用)

    先介绍一些知识 1 文件包含漏洞 和SQL注入等攻击方式一样 文件包含漏洞也是一种注入型漏洞 其本质就是输入一段用户能够控制的脚本或者代码 并让服务端执行 什么叫包含呢 以PHP为例 我们常常把可重复使用的函数写入到单个文件中 在使用该函数
  • Shell编程学习(一)简单介绍和执行shell脚本的方式

    Shell编程是什么 为什么要学习Shell 首先我们要知道 我们的Java项目一般都是部署到Linux系统上的 这是由于Linux相对于Windows而言呢有一下几点 开源 可以修改定制和再发布 安全性更高 虽然windows有很友好的可