Bash 是一种编程语言吗?

什么是 shell 脚本?它是一种编程语言/我们在 shell 脚本中使用的编程语言吗?


免责声明 : 有点跑题
Bash 代表 又一个谍影重重的外壳。(Unix) Shell 是命令行用户界面,或者可以称之为解释器(?)

因此,我填写了一个新的工作申请,你得到了不同的编程语言的经验,然后有这个框在底部的 其他经历-我开始键入 Python 2.7 Powershell Bas...等待!Bash 不是一种编程语言——它是一个可以执行 shell 脚本的控制台... ... 所以... ... 呃... ..。天啊,我不知道!

88647 次浏览

我们可以说 是的,它是一种编程语言。

根据 man bash,Bash 是一种“兼容 sh 的命令语言”。然后,我们可以说“命令语言”是“用户通过它与操作系统或应用程序进行通信的编程语言”。

来自 man bash:

描述

是一种与 sh 兼容的命令语言 解释器,它执行从标准输入或文件读取的命令 还包含了来自 Korn 和 C shell 的有用特性(ksh 和 Csh).

Http://www.gnu.org/software/bash/

是 GNU 计划的外壳是 Bash 是一个与 sh 兼容的 shell,它合并了来自 Korn shell (ksh)和 C shell (csh) IEEE POSIX P1003.2/ISO 9945.2 Shell and Tools 标准 在编程和交互方面对 sh 的功能改进 此外,大多数 sh 脚本可以由 Bash 运行,而不需要 修改。

UNIX shell 是... http://en.wikipedia.org/wiki/Unix_shell

Unix shell 是一个命令行解释器或 shell,它提供一个 Unix 操作系统的传统用户界面 类 Unix 系统。用户通过 输入命令作为文本供命令行解释器执行, 或者通过创建一个或多个此类命令的文本脚本 通常使用一个虚拟终端与 Unix shell 交互, 然而,直接操作通过串行硬件连接,或 网络会话,是常见的服务器系统。

毫无疑问,Bash 是一种编程语言,专门用于 Unix/linux shell 脚本编程。它正在转向完成,所以(理论上)您可以用 Bash 编写任何程序。

对于什么是编程语言,没有完美的定义,但是你可以说,每一种 图灵完成语言都是一种编程语言,因为理论上,每一个可以想到的程序都可以用它来编写(即使这样做可能会很尴尬,即使运行起来非常慢)。而且 Bash 是完整的图灵所以没有什么是 Bash 不能编程的。

一般来说,Bash 和 shell 的问题在于,它缺乏很多基本功能,因此在为它们编写脚本时,实际上通常要调用外部程序来执行所需的工作。但那只是走捷径。例如,如果您需要 shell 中的浮点功能,您可以实际实现它。在图灵完成的所有内容中编写一个完整的 IEEE 754标准实现是可能的。在实践中,这样的实现将非常庞大,需要大量内存,而且速度非常慢,因此最好调用 bc。但是甚至完全在 bash 中实现 bc也是可能的。

下面是我曾经编写的 bash 脚本,它将 Mandelbrot 集绘制到控制台。如果你想看到最终结果,你最好准备好喝几杯咖啡,这将是一个非常漫长的夜晚:

#!/bin/bash


BAILOUT=16
MAX_ITERATIONS=1000


function iterate {
# $1 is x
# $2 is y
local zi=0
local zr=0
local i=0


local cr
cr=$(printf "%s\n" "scale=16; $2 - 0.5" | bc)


while true
do
local temp
local zr2
local zi2
i=$((i + 1))
zr2=$(printf "%s\n" "scale=16; ($zr * $zr) - ($zi * $zi) + $cr" | bc)
zi2=$(printf "%s\n" "scale=16; (($zr * $zi) * 2) + $1" | bc)
temp=$(printf "%s\n" "(($zi * $zi) + ($zr * $zr)) > $BAILOUT" | bc)


if ((temp == 1))
then
return "$i"
fi


if ((i > MAX_ITERATIONS))
then
return 0
fi


zr="$zr2"
zi="$zi2"
done
}


function mandelbrot {
local y
for ((y = -39; y < 39; y++))
do
printf "\n"
local x
for ((x = -39; x < 39; x++))
do
local xi
local yi
local ires
xi=$(printf "%s\n" "scale=16; $x / 40.0" | bc)
yi=$(printf "%s\n" "scale=16; $y / 40.0" | bc)
iterate "$xi" "$yi"
ires=$?


if ((ires == 0))
then
printf "*"
else
printf " "
fi
done
done
printf "\n"
}


mandelbrot

对于那些等不了那么久的人来说,结果应该是这样的:

                                       *
*
*
*
*
***
*****
*****
***
*
*********
*************
***************
*********************
*********************
*******************
*******************
*******************
*******************
***********************
*******************
*******************
*********************
*******************
*******************
*****************
***************
*************
*********
*
***************
***********************
* ************************* *
*****************************
* ******************************* *
*********************************
***********************************
***************************************
*** ***************************************** ***
*************************************************
***********************************************
*********************************************
*********************************************
***********************************************
***********************************************
***************************************************
*************************************************
*************************************************
***************************************************
***************************************************
*    ***************************************************    *
*****  ***************************************************  *****
****** *************************************************** ******
******* *************************************************** *******
***********************************************************************
********* *************************************************** *********
****** *************************************************** ******
*****  ***************************************************  *****
***************************************************
***************************************************
***************************************************
***************************************************
*************************************************
*************************************************
***************************************************
***********************************************
***********************************************
*******************************************
*****************************************
*********************************************
**** ****************** ****************** ****
***  ****************   ****************  ***
*    **************     **************    *
***********       ***********
**  *****           *****  **
*   *                 *   *

它应该像这样的东西转90度(有点挤) :

Mandelbrot set

我的意见

在阅读 Fedorqui 的回答的时候,我很晚才开始回答这个问题,我认为 “编程语言”“命令语言”并不完全一样,“命令语言”意味着 运行命令的语言。

关于 图灵的考虑,是的,你可以... ... 我个人围绕 编写了很多 图书馆(关于监视、备份、系统管理、网络等) ,但显然是为了编写 程序, 你必须使用 真正的程序设计语言

然而

< strong > shell (就像 和其他 一样) 。

第一个目标是 互动命令处理器, 为了使用和维护 系统。

他的第一个应用程序之一是创建 ,以便为运行用其他语言编写的程序准备 环境

这个 指令处理机指令处理机是 理想的系统,文件系统,网络和许多 管理任务,因为 这是互动和使用他的历史使 创作剧本的工作很容易。

他真正的力量

由于这种语言的目的是处理 ,而且由于 说的是 一切都是一个文件,所以 脚本通常可以直接或通过使用 其他人工具/二进制文件/应用程序来处理 一切。这种语言的目的是 围绕 一切创建条件、执行组和交互。

这可以在系统、网络、 iot 等之间开启大量的交互。

一个脚本可以作为示例(进一步参见我的 外壳连接器演示)。

1. Open DB、 SSH 连接和日志文件 同时作为 一个 href = “ https://en.wikipedia.org/wiki/File _ description tor”rel = “ nofollow norefrer”> file description tors
2. Create < em > SQL (临时或非临时)表
3. 执行循环,检查 DB、 SSH 连接或 else 上的事件..。
4. 与数据库和/或 SSH 交互..。
5. 关闭所有 一个 href = “ https://en.wikipedia.org/wiki/File _ description tor”rel = “ nofollow norefrer”> file description tors (DB、 SSH、日志文件等)

Mandelbrot 样本:

关于 麦基的回答的评论展示了如何使用 处理其他二进制文件(用于 Mandelbrot 的 bc)的一个很好的例子..。

其中 是用来 快跑 bc和聚合他的答案。

  • 如果 script 为每个计算执行一个 fork,那么该脚本将使用 很多小时在80列终端上绘制 Mandelbrot。
  • 第一个改进: 只运行一个 背景分叉到 bc -l提交所有计算,下降执行时间到 8分钟
  • 第二个改进: 通过 迭代循环(最多2000次测试)到 bc,下降 自己的执行时间到 8秒
  • 第三个改进: 创建更多的 背景来同时计算多个点() ,为了使用多核,执行时间大约除以可用的核... (感谢 Lea Gris的贡献,帮助使这个 兼容,多核的想法和添加颜色,使这个近乎美丽,我忍不住要发布他的结果) Colored Mandelbrot in terminal

更多样本

我写了一些脚本来展示这种强大的并行能力:

  • Sh 将同时运行多个 ping,并使用 gnuplot绘制动态图形,同时保持交互性。
  • Shell _ 连接器。如果 来源,sh 是一个库,但是如果 快跑,则包含使用 sqlitedatebc作为 背景协同进程的完整演示。
  • Sh 是一个脚本,目的是通过使用带有身份验证、 cookie 和 连接: keep-alive在 SO 服务器上进行连接。

为了进行一些监视,检查差异,我们可以创建一个脚本来打开许多同时的连接 使用 netcatsql-clientftpopen-ssl s_clientssh中的一种或者其他..。

... 在需要时能够运行 sha1sumgrepxmlintbc(如果还没有背景) ,而连接保持开放..。

结论

是一种超级语言,用于使用不同语言的许多程序聚合复杂的应用程序。