繁体   English   中英

bash 是一种编程语言吗?

[英]Is bash a programming language?

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


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

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

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

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

man bash

描述

Bash 是一个 sh 兼容的命令语言解释器,它执行从标准输入或文件中读取的命令。 Bash 还结合了来自 Korn 和 C shell(ksh 和 csh)的有用功能。

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

Bash 是 GNU 项目的外壳。 Bash 是 Bourne Again SHell。 Bash 是与 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 无疑一种编程语言,专门用于 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 度的东西(并且有点挤压):

曼德布罗集

我的两分钱

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

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

然而

是一个外壳(如和其他)! 意思是整体聚合器语言超级语言

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

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

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

他的真正实力

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

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

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

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

曼德布洛特样本:

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

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

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

更多样品

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

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

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

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

结论

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM