Bash是一种编程语言吗?

86

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


免责声明:有点离题
因此bash代表Bourne-again shell。Shell是命令行用户界面,或者也可以称之为解释器(?)。

因此,我正在为新工作填写申请表时,你会被问到不同编程语言的经验,并且底部还有一个框“其他经验”-我开始键入“python 2.7、powershell、bas… ”等等!等等!bash不是一种编程语言-它是一个可以执行shell脚本的控制台……所以……哦天啊,我没头绪!


7
如果您掌握Bash编程语言,建议在技能清单中包括它。毕竟,脚本语言也是编程语言。如果您熟悉足够多的脚本语言,可以在允许的情况下将它们分别列出。多年来,我参加了十几次基于Linux的面试,没有一个面试官问过为什么我把Bash列为编程语言。如果有的话,他们还希望在列表中看到sed和awk。 - Asclepius
1
不仅是一种编程语言,而且是许多事情中最好的编程语言。那些可以通过调用其他程序并组合它们来简化的事情。这是一个巨大的时间节省者。只需确保将代码分解为最小的函数,否则它会变得难以理解和测试。 - Alberto Salvia Novella
是的,就像一块石头可以当作锤子使用一样。 - Bob
4个回答

83
我们可以说,是的,它是一种编程语言。
根据“man bash”的描述,Bash是一个“与sh兼容的命令语言”。那么,我们可以说,“命令语言”是“用户与操作系统或应用程序通信的编程语言”。
从“man bash”中得知:
描述: Bash是一个与sh兼容的命令语言解释器,它执行从标准输入或文件中读取的命令。Bash还包括来自Korn和C shells(ksh和csh)的有用功能。

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

Bash是GNU项目的shell。Bash是Bourne Again SHell的缩写。Bash是一个兼容sh的shell,它还吸收了Korn shell(ksh)和C shell(csh)的有用特性。它旨在符合IEEE POSIX P1003.2 / ISO 9945.2 Shell和Tools标准。它在编程和交互使用方面比sh提供了功能改进。此外,大多数sh脚本可以在不修改的情况下由Bash运行。
而UNIX shell是...http://en.wikipedia.org/wiki/Unix_shell Unix shell是命令行解释器或shell,为Unix操作系统和类Unix系统提供传统用户界面。用户通过输入命令作为文本来指导计算机的操作,以便由命令行解释器执行,或者通过创建一个或多个这样的命令的文本脚本。用户通常使用终端仿真器与Unix shell交互,但对于服务器系统,直接通过串行硬件连接或网络会话操作也很常见。

6
所以bash是一种语言,同时也是一个Shell...?这有点令人困惑,不是吗? - boop
13
你也可以在Python交互模式下启动它,它的行为类似于一个shell。或者JavaScript、Ruby或任何脚本语言。 - Sascha Wolf
3
哦,我明白了。那很有道理。 - boop
3
针对你的最终目标,我一定会在你的简历中写上“bash”。我自己也是这样做的,也包括“awk”。 - fedorqui
2
你漏掉了第一个引号中的部分(重点是我的):“它在编程和交互使用方面都比sh提供了功能上的改进。” - Paul Evans
显示剩余2条评论

29

Bash肯定是一种编程语言,专门用于Unix/Linux shell脚本编程。它是图灵完备的,因此理论上可以在Bash中编写任何程序。


2
同意 - 这完全是围绕着你如何定义编程语言的语义问题。它是否具有专门的语法、数据处理/结构、测试结构、I/O例程等。 - David C. Rankin
2
合格的“编程语言的定义纯属语义学问题”,是的,它是一个 shell,但与该 shell 相关联的是一组规则和语法,可以让您与该 shell 进行交互。man bash 包含大部分信息。所以,是的,它是一个 shell,也是一种编程语言,旨在允许与该 shell 进行交互。 - David C. Rankin
@DavidC.Rankin,如果我用C语言编写一个简单的程序(允许您编写循环/ if-then 语句,写入文件并存储变量),那么它就是一种编程语言吗? - user4453924
6
这场漫不经心的辩论不值得。问题是,如果我在求职申请中列出BASH作为编程语言技能,我会遇到麻烦吗?如果雇主想深入探讨语义,那很好,但我认为没有任何雇主会因为你列出它而扣分。回答您的评论 - 当然可以 - 您认为所有类C语言是如何开始的。 - David C. Rankin
2
在bash中编写正确的“程序”也并不难。例如,Kubernetes和git都使用大量的bash。我个人也曾经在bash中解决过常规的白板问题。 - CoffeeTableEspresso

15
没有一个完美的定义来解释编程语言是什么,但可以说每一种图灵完备的语言都是一种编程语言,因为理论上可以使用它编写任何可想象的程序(即使这样做可能很麻烦,运行速度也会非常慢)。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


2
从1个晚上到不到10分钟!避免forks,将bc作为后台子任务运行...尝试我修改过的bash mandelbrot版本(仍然丑陋,但更快!;-) - F. Hauri - Give Up GitHub
2
好的,这里有一个经过修改并在MacOS和bash 3.2.57下测试的版本(执行时间:8m33.022s):https://f-hauri.ch/vrac/mandelbrot_backgndBc_4macOs.sh.txt - F. Hauri - Give Up GitHub
1
@F.Hauri 这里不需要使用bashisms。一个POSIX shell版本甚至更快POSIX/shell Mandelbrot @ Gist-GitHub - Léa Gris
2
@LéaGris 使用bc作为后台的一个优点是:您可以在bc中定义和使用函数!现在,我的新版本可以在不到10秒钟的时间内完成工作!! - F. Hauri - Give Up GitHub
1
@F.Hauri无法使用POSIX shell流式传输tput,但使用了您的bc函数,现在呈现与上面参考图片相同的方向和颜色渐变。https://i.stack.imgur.com/qY17L.jpg - Léa Gris
显示剩余6条评论

6

我的看法

虽然有点晚,来到这个SO问题,阅读fedorqui的答案后,我认为“编程语言”并不完全等同于“命令语言”,即旨在运行命令的语言。

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

然而

是一个shell(像和其他一样)! 这意味着它是一个总合聚合语言超级语言

第一个目标是成为一个交互式命令处理器,以便使用和维护系统。

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

因此,这个命令处理器非常适合系统、文件系统、网络和很多管理任务,因为它是交互式的,并且使用其历史记录使得创建脚本变得非常容易。

它的真正力量

作为一种旨在处理的语言,并且因为说过everything is a file,一个脚本通常可以直接或通过使用其他工具/二进制文件/应用程序来处理everything。这种语言旨在创建关于everything的条件、执行组和交互。

这可以在系统、网络、物联网等之间打开很多交互性...

例如,脚本可以(请参见我的shell连接器演示)。

1. 同时作为文件描述符打开DB、SSH连接和日志文件。
2. 创建SQL(临时或非临时)表
3. 循环,检查DB、SSH连接或其他事物的事件...
4. 与DB和/或SSH进行交互...
5. 关闭所有文件描述符(DB、SSH、日志文件等)。

Mandelbrot示例:

关于Mecki's回答的评论展示了如何使用处理其他二进制文件(Mandelbrot 中的bc)的良好范例...

其中用于 运行 bc 并聚合其答案。

  • 如果一个脚本每次计算都要进行一次分叉,那么在80列终端上绘制Mandelbrot需要很多小时
  • 第一次改进:仅运行一个后台分支到bc -l以提交所有计算,将执行时间降至8分钟
  • 第二次改进:迭代循环(高达2000个测试)传递给bc,将执行时间降至8秒
  • 第三次改进:创建更多的后台bc以同时计算多个点(),以使用多核心,将执行时间大约分为可用核心...(感谢Léa Gris的贡献,帮助实现这个兼容、多核心的想法,并添加颜色,使它变得近乎美丽,我无法抗拒地发布他们的结果) Colored Mandelbrot in terminal

更多示例

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

  • grepLogByDate:使用(至少有5个forks到seddatebcpaste)解析日志文件以对时间戳进行处理,比使用快多达3倍
  • multiping.sh:同时运行多个ping并使用gnuplot绘制动态图形,同时保持交互性。
  • shell_connector.sh:是一个库,但包含一个完整的演示,使用sqlitedatebc作为后台协作进程,如果运行,则会被引用。
  • getSo.sh:是一个脚本,旨在使用进行身份验证、cookie和Connection: keep-alive来连接SO服务器。
为了进行一些监控、检查差异等操作,我们可以创建一个脚本来打开许多同时连接到许多不同目标的连接,使用其中之一的netcatsql-clientftpopen-ssl s_clientssh或其他工具...

...在连接保持开放的同时,可以运行sha1sumgrepxmlintbc(如果尚未被后台化)时需要,而不影响连接。

结论

是一种超级语言,有助于使用各种语言中的许多程序来聚合复杂的应用程序。


很令人印象深刻,看到你在发布回答多年后还进行编辑。 - kvantour
@kvantour 我在 2021年5月12日 首先发布了这个答案。但你是对的:我只是重新编辑了如何测试变量是否为数字这个问题的答案,这个答案我发布已经超过一年了。 - F. Hauri - Give Up GitHub
啊,我看错日期了,我以为是2012年5月;-)(比实际问题出现的时间早了3年) - kvantour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接