簡體   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