shell是Linux或Unix操作系统中的一个程序,它允许您输入命令供系统执行。当在linux计算机上打开终端窗口时,它启动shell程序,该程序提供一个输入命令的界面。此接口称为命令行接口。输入命令后,shell将执行该命令,并在屏幕上显示输出。
除了能够以交互方式接受和执行命令外,shell还可以执行存储在文件中的命令。这种执行模式称为shell脚本,本文将介绍shell脚本的基础知识。
从20世纪70年代的Unix开始,Ken Thomson开发了一个名为v6shell的shell程序。它是一个交互式shell,缺乏脚本能力。
1977年,bourneshell紧随其后,至今仍作为root帐户的默认Shell使用。这个shell增加了脚本能力,这在多年的实践中证明是非常有用的。
壳牌在20世纪80年代的进一步发展催生了许多流行的壳牌变种,其中最流行的是C-shell和Korn shell。这些shell中的每一个都有自己的语法,在某些情况下,这些语法与原始shell截然不同。
今天最流行的Shell之一是Bash Shell。Bash代表Bourne Shell,是原始Bourne Shell的一个大大改进的变体。
在本文中,我们将描述bashshell的shell脚本。
如何执行shell脚本?很简单。只需将脚本路径作为参数传递给shell:
示例shell脚本:
echo "hello world"
按如下方式运行:
$ bash hello.sh
# prints
hello world
注意:shell要求行以LF字符结尾(换行符)。如果您在Windows上编写shell脚本,并试图直接在Linux系统上执行,则可能会出错。Windows使用CR-LF组合(回车换行)进行换行。这只需要转换成LF。请检查您的Windows编辑器,以了解执行此操作的方法。
还有另一种方法可以直接作为命令执行shell脚本。**以下行(hashbang声明)作为shell脚本的第一行。
#!/bin/bash
通过此更改,我们的简单shell脚本现在是:
#!/bin/bash
echo "hello world"
现在,您需要使脚本文件可执行,如下所示:
$ chmod +x hello.sh
此时,可以直接执行脚本文件,而不必显式引用shell。
$ hello.sh
# prints
hello world
现在让我们看看使用shell脚本的一些优点。
使用shell脚本的第一个优点是自动化频繁执行的任务。假设你每天都要做一件事。如果您每天需要在linux系统上执行多个命令,可以将这些命令存储在一个文件中并运行脚本。示例包括:
除了自动化频繁的任务外,您还可能发现将多个命令序列组合到一个命令中是一种优势。记住一个命令要比记住多个命令简单得多,更不用说执行命令的顺序了。
一个例子是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
fi
fi
# 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 i
fi
在C/C++中编写的常规程序中,可以执行与shell脚本相同的操作。但是,编写和调试shell脚本比C/C++程序要容易得多。特别是对于系统管理任务,包括执行外部命令、创建和删除文件和目录、重定向输出等。
C/C++程序对于较低的操作水平更好,例如调用系统调用、操作数据结构等。
由于shell脚本是一个文本文件,因此可以很容易地查看它执行的操作。相比之下,只有这样,你才能知道用C++(如编译为可执行文件)的语言编写的程序是在选择告诉你还是访问源代码。例如,可以检查shell脚本是否正在删除任何文件,如果需要这些文件,可以将它们复制到其他位置。
使用shell脚本诊断问题也比使用常规程序容易得多,因为您可以查看源代码。脚本失败是因为目录不存在吗?您可以查看脚本代码并创建目录(尽管行为良好的shell脚本应该检查并创建它以避免此类错误)。
shell脚本可以传输到其他Unix和类Unix操作系统并执行(如果存在shell本身)。即使在从X86、MIPS、SPARC等不同架构中传输shell脚本时,shell脚本也比C/C++程序更便携。
C/C++程序可以在另一个系统上传输和使用的唯一方法是复制源代码,构建程序,并尝试运行它。即使如此,如果它使用特定于体系结构的代码,它也可能无法按预期工作。
既然您已经知道了shell脚本是什么以及它们的许多优点,您不想在任务中使用它们吗?您在使用它们时遇到了哪些问题?请在下面的评论中告诉我们。
...任何操作。如果它返回“1”,那么ping失败,您需要做些什么。在我的例子中,我使用Windows CDO对象发送电子邮件: ...
... 为什么使用shell脚本?如果你是编程新手,从小事做起会更好。不仅你不太可能放弃,而且你还有机会停下来学习。也就是说,你的第一个程序可以非常有用,即使它们也...
假设你是一个bash脚本向导,喜欢为不太懂技术的朋友和家人自动化任务。即使你给了他们一个脚本,完全解决了他们的问题,他们可能仍然担心自己使用终端。在这种情况下,您不妨手动为它们执行所有操作。 ...
... 但是,为什么每个人都用“Hello,World”而不是“Hey,World”或“Hiya,World”? ...
...终端仿真器绝对是两个不同的应用程序。那么Bash到底是什么呢?在这篇短文中,我们将探讨Bash是什么,它做什么,以及如何开始使用它。 ...
受限的shell限制了用户帐户在Linux上可以做什么。受限用户不能更改其目录,您可以控制他们可以访问哪些命令。下面介绍如何在Linux上设置受限shell。 受限炮弹 受限shell不是另一个shell。这是标准外壳的另一种模式。Bash、Kor...
...使用chsh命令将其设置为默认shell。我们会教你怎么做。 为什么贝壳很重要 shell位于您和操作系统之间。它在终端窗口内提供环境,允许您键入命令和运行程序。shell检查您的输入并找出您想要的内容。如果它能执行你的出价本...
...关闭child bash会话,请使用exit: exit 继承的环境也会影响脚本。下面是一个简单的脚本,它将三个环境变量的值写入终端窗口: #!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR 这被保...
...尾随的正斜杠,这样就可以重复制表符完成过程。这也是为什么第一个命令后面有一个正斜杠。第二张没有,因为那张是打出来的。 您可以使用波浪号(~)作为从文件系统中任意位置快速返回主目录的速记方式;只需键入以下...