【问题标题】: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 是一个库,如果来源,但包含一个完整的演示,使用sqlitedatebc 作为背景如果运行。
  • getSo.sh 是一个旨在连接 SO 服务器的脚本,通过使用 和身份验证、cookie 和 Connection: keep-alive

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

...能够在需要时运行sha1sumgrepxmlintbc(如果尚未后台运行),同时连接保持打开...

结论

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

【讨论】:

  • 令人印象深刻的是,您在发布答案多年后仍对其进行编辑。
  • @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
相关资源
最近更新 更多