【问题标题】:Is bash a programming language?bash 是一种编程语言吗?
【发布时间】:2015-02-24 10:47:41
【问题描述】:

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


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

所以我正在填写一份新工作的申请,然后你被要求提供不同编程语言的经验,然后底部有这个框其他经验 - 我开始输入 python 2.7、powershell、bas...等等! bash 不是一种编程语言——它是一个可以执行 shell 脚本的控制台……所以……呃……我的天哪,我不知道!

【问题讨论】:

  • FWIW,如果你有 Bash,请做包含 Bash 作为编程语言技能。毕竟,scripting languages 是编程语言。但是,从技术上讲,如果您了解足够多的脚本语言,则可以在文档允许的情况下单独列出它们。多年来,在接受了十多次基于 Linux 的工作面试之后,没有一个面试官问我为什么将 Bash 列为编程语言。如果有的话,他们还希望在该列表中看到 sed 和 awk。
  • 不仅是一种编程语言,而且是适用于许多事情的最好的编程语言。通过调用其他程序并组合它们可以更简单地完成那些事情。 巨大的时间节省。只要确保将代码分解成最小的函数,否则它会变得难以理解和测试。

标签: bash


【解决方案1】:

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

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

来自man bash:

描述

Bash 是一种与 sh 兼容的命令语言解释器,它执行从标准输入或文件读取的命令。重击 还结合了 Korn 和 C shell(ksh 和 csh)。

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

Bash 是 GNU 项目的外壳。 Bash 是 Bourne Again SHell。重击 是一个与 sh 兼容的 shell,它结合了来自 Korn shell (ksh) 和 C shell (csh)。它旨在符合 IEEE POSIX P1003.2/ISO 9945.2 外壳和工具标准。它提供 在编程和交互方面对 sh 的功能改进 利用。此外,大多数 sh 脚本都可以通过 Bash 运行,而无需 修改。

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

Unix shell 是一个命令行解释器或 shell,它提供了一个 Unix 操作系统的传统用户界面和 类 Unix 系统。用户通过以下方式直接操作计算机 输入命令作为命令行解释器执行的文本, 或通过创建一个或多个此类命令的文本脚本。用户 通常使用终端模拟器与 Unix shell 交互, 但是,通过串行硬件连接直接操作,或 网络会话,对于服务器系统很常见。

【讨论】:

  • 所以 bash 是一门语言 - 但它也是一个 shell.. ?这很令人困惑,不是吗?
  • @Brettetete 你也可以在交互模式下启动 Python,它的行为就像一个 shell。或 JavaScript、Ruby 或任何脚本语言。
  • @Zeeker 哦……一分钱掉了。这很有意义
  • @Brettetete 关于你的最终目标,我肯定会在你的简历中写上“bash”。我这样做了,也用“awk”。
  • 您在第一句话中留下的部分(强调我的):“它为 编程 和交互式使用提供了对 sh 的功能改进。”
【解决方案2】:

Bash 肯定是一种编程语言,专门用于 unix/linux shell 脚本。它已经完成,因此您可以(理论上)在 Bash 中编写任何程序。

【讨论】:

  • 同意——所有的语义都围绕着你如何定义编程语言来解决。它是否有专门的语法、数据处理/结构、测试结构、I/O 例程等...
  • 符合“所有语义都围绕您如何定义编程语言来解决”是的,它是一个外壳,但与该外壳相关的是一组规则和语法,允许您与壳。 man bash 包含最多。所以,是的,它是一个外壳,是的,它是一种旨在允许与外壳交互的编程语言。
  • @DavidC.Rankin 所以如果我用 C 编写一个简单的程序(它允许你编写循环/ifthens,写入文件和存储变量)那么它是一种编程语言?
  • 这种敷衍的辩论不值得。问题是我是否会在求职申请中将 BASH 列为编程语言技能时遇到麻烦。如果雇主想深入研究语义,那很好,但我认为任何雇主都不会因为你列出它而叮嘱你。回答您的评论 - 当然 - 您认为所有类似 c 的语言是如何开始的。
  • 在 bash 中编写正确的“程序”也不是那么难。例如,Kubernetes 和 git 都使用大量的 bash。我个人也解决了 bash 中的常规白板问题......
【解决方案3】:

对于编程语言到底是什么并没有完美的定义,但你可以说每种语言 Turing-complete 都是一种编程语言,因为理论上每个可以想到的程序都可以用它编写(即使它可能这样做会很尴尬,即使运行起来会非常缓慢)。而且 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 度的东西(并且有点挤压):

【讨论】:

【解决方案4】:

我的两分钱

迟到了这个 SO 问题,阅读 fedorqui's answer,我认为 "programming language" 与 "command language" 不完全相同,意思是一种语言旨在运行命令。

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

然而

是一个shell(如 和其他)!意思是一种整体聚合器语言,或超级语言。

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

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

所以这个命令处理器是 非常适合系统、文件系统、网络和许多管理任务,因为 它是交互式的,并且使用他的历史使 创建脚本 工作变得简单。

他的真正实力

由于该语言旨在处理s、s、s,并且因为 表示everything is a file,所以 脚本通常可以处理一切 em>,直接或使用 others 工具/二进制文件/应用程序。这种语言旨在 围绕一切创建条件、执行组和交互。

这可以打开系统、网络、物联网等之间的大量交互......

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

1.file descriptors
2.同时打开数据库、SSH 连接和日志文件。
2. strong> 创建 SQL(临时或非临时)表
3. 执行循环,检查 DB 上的事件、SSH 连接或其他...
4. 与 DB 和/或 SSH 交互...
5. 关闭所有 file descriptors(DB、SSH、日志文件等) )

曼德布罗样本:

Mecki's anwers 上的评论展示了如何使用 处理其他二进制文件的一个很好的示例(bc 用于 Mandelbrot)...

用于运行 bc 并汇总他的答案。

  • 如果脚本为每个计算执行一次分叉,则此脚本将花费 许多小时在 80 列终端上绘制 Mandelbrot。
  • 第一个改进:只运行一个后台 fork 到bc -l 以提交所有计算,将执行时间降低到8 分钟。
  • 2nd improvement: 将 iterate 循环(最多 2000 个测试)传递给 bc,丢弃 自己的执行时间8秒。
  • 3nd improvement: 创建更多背景bc 用于同时计算多个点,以便使用多核,将执行时间近似地除以可用内核...(感谢Léa Gris 的贡献,帮助使这个 兼容,多核想法和添加颜色,使它接近美丽,我忍不住发布他的结果)

更多示例

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

  • multiping.sh 将同时运行多个 ping 并使用 gnuplot 绘制动态图形,同时保持交互。
  • shell_connector.sh 是一个库,如果来源,但包含一个完整的演示,使用sqlite、date 和bc 作为背景如果运行。
  • getSo.sh 是一个旨在连接 SO 服务器的脚本,通过使用 和身份验证、cookie 和 Connection: keep-alive。

为了进行一些监控,检查差异等,我们可以创建一个脚本来打开许多同时连接 到许多不同的目标,使用netcat、sql-client、ftp、open-ssl s_client、ssh 之一或其他...

...能够在需要时运行sha1sum、grep、xmlint 或bc(如果尚未后台运行),同时连接保持打开...

结论

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

【讨论】:

  • 令人印象深刻的是,您在发布答案多年后仍对其进行编辑。
  • @kvantour 我首先在May 12 2021 上发布了这个答案。但你是对的:我刚刚编辑重写了this answer to How to test if a variable is a number 一年多前我已经发布了。
  • 啊,我看错了日期,我以为是 2012 年 5 月 ;-)(实际问题出现前 3 年)
猜你喜欢
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2011-07-20
  • 2010-09-13
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多