bash是一种编程语言吗?

boo*_*oop 51 bash

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


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

所以我正在填写一份新工作的应用程序,你会被要求获得不同编程语言的经验,然后在底层有其他经验 - 我开始输入python 2.7,powershell,bas ...等等!bash不是一种编程语言 - 它是一个可以执行shell脚本的控制台...所以......呃......天哪,我不知道!

fed*_*qui 57

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

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

来自man bash:

描述

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

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

Bash是GNU Project的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进行交互,但是,通过串行硬件连接或网络会话的直接操作对于服务器系统是常见的.

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

Pau*_*ans 13

Bash肯定一种编程语言,专门用于unix/linux shell脚本.这是完整的,所以你可以(理论上)用Bash编写任何程序.

  • 这种敷衍的辩论是不值得的.问题是我在将BASH列为作业应用程序的编程语言技能时遇到了麻烦.如果雇主想要深入研究那些没问题的语义,但我认为没有任何雇主可以将你列入其中.回答你的评论 - 当然 - 你怎么认为所有类似c语言的开始. (4认同)
  • 同意 - 所有语义都可以解决您如何定义编程语言.它是否具有专门的语法,数据处理/结构,测试结构,I/O例程等... (2认同)
  • 在"它是所有语义解决你如何定义编程语言"的条件下是合格的是它是一个shell,但与该shell相关联的是一组允许您与shell交互的规则和语法.`man bash`包含最多.所以,是的,它是一个shell,是的,它是一种旨在允许与该shell进行交互的编程语言. (2认同)
  • 在 bash 中编写正确的“程序”也不难。例如,Kubernetes 和 git 都使用大量的 bash。我个人也解决了 bash 中的常规白板问题。 (2认同)

Mec*_*cki 7

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

Bash、shell 的问题是,它缺乏很多基本功能,因此在为它们编写脚本时,您实际上经常调用外部程序来执行所需的工作。但这只是走捷径。例如,如果您需要 shell 中的浮点功能,您实际上可以实现它。可以在图灵完备的所有内容中编写完整的 IEEE 754 标准实现。在实践中,这样的实现将是巨大的,需要大量内存并且非常慢,所以最好调用bc它。但即使bc完全在 bash 中实现也是可能的。

这是我曾经写过的一个 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
Run Code Online (Sandbox Code Playgroud)

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

                                       *                                      
                                       *                                      
                                       *                                      
                                       *                                      
                                       *                                      
                                      ***                                     
                                     *****                                    
                                     *****                                    
                                      ***                                     
                                       *                                      
                                   *********                                  
                                 *************                                
                                ***************                               
                             *********************                            
                             *********************                            
                              *******************                             
                              *******************                             
                              *******************                             
                              *******************                             
                            ***********************                           
                              *******************                             
                              *******************                             
                             *********************                            
                              *******************                             
                              *******************                             
                               *****************                              
                                ***************                               
                                 *************                                
                                   *********                                  
                                       *                                      
                                ***************                               
                            ***********************                           
                         * ************************* *                        
                         *****************************                        
                      * ******************************* *                     
                       *********************************                      
                      ***********************************                     
                    ***************************************                   
               *** ***************************************** ***              
               *************************************************              
                ***********************************************               
                 *********************************************                
                 *********************************************                
                ***********************************************               
                ***********************************************               
              ***************************************************             
               *************************************************              
               *************************************************              
              ***************************************************             
              ***************************************************             
         *    ***************************************************    *        
       *****  ***************************************************  *****      
       ****** *************************************************** ******      
      ******* *************************************************** *******     
    ***********************************************************************   
    ********* *************************************************** *********   
       ****** *************************************************** ******      
       *****  ***************************************************  *****      
              ***************************************************             
              ***************************************************             
              ***************************************************             
              ***************************************************             
               *************************************************              
               *************************************************              
              ***************************************************             
                ***********************************************               
                ***********************************************               
                  *******************************************                 
                   *****************************************                  
                 *********************************************                
                **** ****************** ****************** ****               
                 ***  ****************   ****************  ***                
                  *    **************     **************    *                 
                         ***********       ***********                        
                         **  *****           *****  **                        
                          *   *                 *   *      
Run Code Online (Sandbox Code Playgroud)

它应该类似于这种旋转 90 度(有点挤压)的东西:

曼德布罗集

  • 从 1 晚到不到 10 分钟!避免 *forks*,运行 `bc` 作为后台子任务...尝试 [我修改的 bash mandelbrot 版本](https://f-hauri.ch/vrac/mandelbrot_backgndBc.sh.txt) (仍然丑陋,但更快! ;-) (2认同)
  • 好的,有[在MacOS和bash 3.2.57下测试的修改版本](https://f-hauri.ch/vrac/mandelbrot_backgndBc_4macOs.sh.txt) (执行时间: 8m33.022s) (2认同)
  • @LéaGris 使用 bc 作为背景的优点之一是:您可以在 bc 中定义和使用函数!现在[我的新版本](https://f-hauri.ch/vrac/mandelbrot_posix-func2bc.sh.txt) 在不到 10 秒的时间内完成工作! (2认同)

F. *_*uri 6

我的两分钱

\n

来这个问题有点晚了,阅读fedorqui 的答案,我认为“编程语言”与“命令语言”并不完全相同,意思是一种旨在运行命令的语言。

\n

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

\n

然而

\n

是一个shell(就像和其他一样)!意思是一种整体聚合语言,或者一种超级语言

\n

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

\n

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

\n

因此,这个命令处理器对于系统、文件系统、网络和许多管理任务来说是理想的选择,因为它的交互性和使用其历史记录使得创建脚本的工作变得非常容易。

\n

它的真正力量

\n

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

\n

这可以在系统、网络、物联网等之间开启大量的交互……

\n

例如,可以使用脚本(进一步参见我的shell 连接器演示)。

\n

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

\n

曼德尔布罗样本:

\n

Mecki 答案的评论显示了如何使用处理其他二进制文件(bc对于 Mandelbrot)的一个很好的示例......

\n

用于运行和聚合 bc答案。

\n
    \n
  • 如果脚本为每次计算执行一次 fork,则该脚本将花费数小时在 80 列终端上绘制 Mandelbrot。
  • \n
  • 第一项改进:仅运行一个后台分支来bc -l提交所有计算,将执行时间降至8 分钟
  • \n
  • 第二个改进:将迭代循环(最多 2000 次测试)传递给bc,将执行时间降低到8 秒
  • \n
  • 第三个改进:为同时计算多个点()创建更多背景bc,以便使用多核,将执行时间大致除以可用核心...(感谢L\xc3\xa9a Gris的贡献,帮助实现了这一点兼容,多核想法并添加颜色,使这近乎美丽,我无法抗拒发布他们的结果)\n终端中的彩色曼德尔布罗
  • \n
\n

更多示例

\n

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

\n
    \n
  • grepLogByDate使用根据时间戳解析日志文件的速度比使用perl3 倍(至少有 5 个分支到、和)。seddatebcpaste
  • \n
  • multiping.sh将同时运行多个ping并使用 绘制动态图形gnuplot,同时保持交互性。
  • \n
  • shell_connector.sh是一个库(如果有来源)sqlite,但包含使用datebc作为后台协进程(如果运行)的完整演示
  • \n
  • getSo.sh是一个旨在通过使用进行身份验证、cookies 和Connection: keep-alive来连接 SO 服务器的脚本
  • \n
\n

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

\n

...具有运行sha1sum, grep,xmlintbc(如果尚未后台运行),同时连接保持打开状态

\n

结论

\n

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

\n