[英]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 的答案,我认为“编程语言”与“命令语言”并不完全相同,意思是一种旨在运行命令的语言。
关于图灵的考虑,是的,你可以...我个人围绕bash编写了很多库(围绕监控、备份、系统管理员、网络等),但显然要编写程序,您必须使用真正的编程语言。
bash是一个外壳(如sh和其他外壳)! 意思是整体聚合器语言或超级语言。
第一个目标是成为一个交互式命令处理器,以便使用和维护posix系统。
他的第一个应用程序之一是创建wrapper以便为运行用其他语言编写的程序准备环境。
所以这个命令处理器非常适合系统、文件系统、网络和许多管理任务,因为它是交互式的,并且使用他的历史记录可以轻松创建脚本作业。
由于该语言旨在处理io s、 fork s、 fifo s,并且因为posix说一切都是文件,所以shell脚本通常可以直接或通过使用其他工具/二进制文件/应用程序来处理所有内容。 这种语言旨在围绕一切创建条件、执行组和交互。
这可以打开系统、网络、物联网等之间的大量交互性......
一个脚本可以作为示例(进一步参见我的shell 连接器演示)。
1.同时打开DB、SSH连接和日志文件作为文件描述符。
2.创建SQL(临时或非临时)表
3.做循环,检查数据库事件,SSH连接或其他......
4.与 DB 和/或 SSH 交互...
5.关闭所有文件描述符(DB、SSH、日志文件等)
对Mecki 的回答的评论展示了如何使用bash处理其他二进制文件(对于 Mandelbrot 的bc
)的一个很好的示例......
其中shell用于运行bc
并汇总他的答案。
bc -l
以提交所有计算,将执行时间降低到8 分钟。bc
,将自己的执行时间降低到8 秒。bc
,以便使用多核,将执行时间近似地除以可用内核......(感谢Léa Gris的贡献,帮助使这个posix兼容,多核的想法和添加颜色,使这个接近美丽,我忍不住发布他的结果) 我写了一些脚本来展示这种强大的并行化能力:
ping
并使用gnuplot
绘制动态图形,同时保持交互。sqlite
、 date
和bc
作为后台协同进程(如果run )。 为了进行一些监控,检查差异等,我们可以创建一个脚本来打开许多同时连接到许多不同目标的连接,使用netcat
, sql-client
, ftp
, open-ssl s_client
, ssh
或其他.. .
...能够在需要时运行sha1sum
、 grep
、 xmlint
或bc
(如果还没有后台),同时连接保持打开...
shell是一种超级语言,可用于使用各种语言的许多程序聚合一个复杂的应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.