什么是Shell脚本以及为什么要使用它

shell是Linux或Unix操作系统内的程序,可让您输入命令以供系统执行。在Linux计算机上打开终端窗口时,它将启动shell程序,该shell程序提供输入命令的界面。该界面称为命令行界面。输入命令后,该命令将由外壳程序执行并在屏幕上显示输出。

除了能够交互接受和执行命令外,外壳程序还可以执行存储在文件中的命令。这种执行模式称为 shell脚本,在本文中,我们介绍了shell脚本的基础。

1。 Shell的历史

从1970年代的Unix开始,有一个由Ken Thomson开发的名为 V6 Shell 的Shell程序。它是一个交互式shell,缺乏脚本编写能力。

紧随其后的是1977年的 Bourne Shell ,至今仍用作 root 的默认shell。强>帐户。这种shell增加了脚本编写功能,多年来证明在实践中非常有用。

1980年代shell的进一步发展产生了许多流行的shell变体,其中最流行的是 C -Shell Korn Shell 。每个shell都有自己的语法,在某些情况下,它们与原始shell完全不同。

当今最受欢迎的shell之一是 Bash Shell 。 Bash代表 Bourne-Again-Shell ,它是原始Bourne Shell的极大改进。

在本文中,我们描述了Bash Shell的shell脚本。

2。执行Shell脚本

如何执行Shell脚本?简单。只需将脚本路径作为参数传递给shell:

一个示例shell脚本:

echo "hello world"

按如下所示运行它:

$ bash hello.sh# printshello world

注意:外壳程序要求以LF字符(换行)结尾的行。如果您在Windows上编写Shell脚本并尝试直接在Linux系统上执行它,则可能会遇到错误。 Windows使用CR-LF组合(Carriage-Return-Line-Feed)进行线路终止。这仅需要转换为LF。检查Windows编辑器以了解执行此操作的方法。

还有另一种直接将Shell脚本作为命令执行的方法。插入以下行( bang 声明)作为您的shell脚本的第一行。

#!/bin/bash

进行此更改后,我们的简单shell脚本现在为:

#!/bin/bashecho "hello world"

现在,您需要使脚本文件可执行如下:

$ chmod +x hello.sh

此时,您可以直接执行脚本文件,而不必显式引用外壳程序。

$ hello.sh# printshello world

现在让我们看一下使用shell脚本的一些优点。

3。任务自动化

使用shell脚本的第一个优点是使经常执行的任务自动化。假设您有一项每天需要执行的任务。如果您需要每天在Linux系统上执行多个命令,则可以将这些命令存储在文件中并运行脚本。示例包括:

  • 每天存档和上传文件或文件夹到S3之类的云存储设施。
  • 压缩日志文件,该日志文件每天都在增长。
  • 获取股票价格,解析获取的数据,并在满足某些条件(价格过高或过低)时触发电子邮件或SMS。
  • 4。组合多个命令

    除了自动执行频繁的任务,您还可以发现将多个命令序列组合为一个命令的优势。记住单个命令比多个命令简单得多,更不用说它们必须执行的顺序。

    一个例子就是Linux操作系统本身的启动顺序。作为启动的一部分,操作系统执行许多命令以使系统进入正确的状态。这些命令实际上是位于 / etc 目录下的shell脚本。如果您看一看这些shell脚本之一,您将认识到引导系统的复杂性,在没有shell脚本的情况下,您可能必须手动执行该操作。

    以下是示例shell脚本 / etc / profile ,该脚本将在用户每次登录时执行。想象一下,手动键入这些命令!

    # /etc/profile: system-wide .profile file for the Bourne shell (sh(1))# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).if [ "$PS1" ]; then  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then    # The file bash.bashrc already sets the default PS1.    # PS1='\h:\w\$ '    if [ -f /etc/bash.bashrc ]; then    . /etc/bash.bashrc    fi    else    if [ "`id -u`" -eq 0 ]; then    PS1='# '    else    PS1='$ '    fi  fifi# The default umask is now handled by pam_umask.# See pam_umask(8) and /etc/login.defs.if [ -d /etc/profile.d ]; then  for i in /etc/profile.d/*.sh; do    if [ -r $i ]; then    . $i    fi  done  unset ifi

    5。开发更容易

    在用C / C ++编写的常规程序中,可以执行与Shell脚本相同的操作。但是,编写和调试Shell脚本要比C / C ++程序容易得多。特别是对于系统管理任务,包括执行外部命令,创建和删除文件和目录,重定向输出等。

    C / C ++程序对于较低级别的操作(例如调用系统调用)更好。 ,操作数据结构等。

    6。透明度

    shell脚本由于是文本文件,因此可以轻松查看以检查其执行的操作。相比之下,您唯一知道用C / C ++等语言编写(并编译为可执行文件)的程序在做什么的唯一方法是选择告诉您还是您可以访问源代码。例如,您可以检查Shell脚本是否正在删除任何文件,并且如果需要这些文件,则可以将它们复制到其他位置。

    使用Shell脚本诊断问题也要容易得多,而不是比常规程序要好,因为您可以查看源代码。该脚本是否因为目录不存在而失败?您可以查看脚本代码并创建目录(尽管行为良好的Shell脚本应检查并创建它以避免出现此类错误)。

    7。可移植

    shell脚本可以传输到其他Unix和类似Unix的操作系统并执行(如果存在shell本身)。即使从不同的体系结构(例如x86,MIPS,Sparc等)传输外壳程序脚本,外壳程序脚本也比C / C ++程序具有更高的可移植性。

    C / C ++程序可以传输和在另一个系统上使用的是复制源代码,构建程序并尝试运行它。即使这样,如果使用特定于体系结构的代码,它也可能无法按预期工作。

    标签: