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进行交互,但是,通过串行硬件连接或网络会话的直接操作对于服务器系统是常见的.
Pau*_*ans 13
Bash肯定是一种编程语言,专门用于unix/linux shell脚本.这是完整的,所以你可以(理论上)用Bash编写任何程序.
编程语言到底是什么并没有完美的定义,但你可以说每一种图灵完备的语言都是一种编程语言,因为理论上每个可以想到的程序都可以用它编写(即使它可能很尴尬)这样做,即使运行速度会非常慢)。而且 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 度(有点挤压)的东西:
来这个问题有点晚了,阅读fedorqui 的答案,我认为“编程语言”与“命令语言”并不完全相同,意思是一种旨在运行命令的语言。
\n关于图灵的考虑,是的,你可以......我个人围绕bash编写了很多库(围绕监控、备份、系统管理、网络等),但显然为了编写程序, \n你必须使用真正的编程语言。
\nbash是一个shell(就像sh和其他shell一样)!意思是一种整体聚合语言,或者一种超级语言。
\n第一个目标是成为一个交互式命令处理器,\n以便使用和维护posix系统。
\n它的第一个应用程序是创建包装器,以便为运行用其他语言编写的程序准备环境。
\n因此,这个命令处理器对于系统、文件系统、网络和许多管理任务来说是理想的选择,因为它的交互性和使用其历史记录使得创建脚本的工作变得非常容易。
\n由于这种语言旨在处理io、fork、fifo ,并且因为posix表示一切都是文件,所以shell脚本通常可以直接或通过使用其他工具/二进制文件/应用程序来处理一切。这种语言的目的是\n创建条件、执行组和围绕一切的交互。
\n这可以在系统、网络、物联网等之间开启大量的交互……
\n例如,可以使用脚本(进一步参见我的shell 连接器演示)。
\n1.同时 打开 DB、SSH 连接和日志文件作为文件描述符。
\n 2. 创建SQL(临时或非临时)表
\n 3. 执行循环、检查 DB、SSH 连接或其他事件上的事件...
\n 4. 与 DB 和/或 SSH 交互...
\n 5 . 关闭所有文件描述符(DB、SSH、日志文件等)
对Mecki 答案的评论显示了如何使用bash处理其他二进制文件(bc
对于 Mandelbrot)的一个很好的示例......
shell用于运行和聚合其 bc
答案。
bc -l
提交所有计算,将执行时间降至8 分钟。bc
,将执行时间降低到8 秒。bc
,以便使用多核,将执行时间大致除以可用核心...(感谢L\xc3\xa9a Gris的贡献,帮助实现了这一点posix兼容,多核想法并添加颜色,使这近乎美丽,我无法抗拒发布他们的结果)\n我编写了一些脚本来展示这种强大的并行化功能:
\nsed
date
bc
paste
ping
并使用 绘制动态图形gnuplot
,同时保持交互性。sqlite
,但包含使用date
和bc
作为后台协进程(如果运行)的完整演示。为了进行一些监视、检查差异等,我们可以创建一个脚本来打开许多同时连接\n到许多不同目标的连接,使用netcat
、sql-client
、ftp
、open-ssl s_client
、ssh
其他之一...
...具有运行sha1sum
, grep
,xmlint
或bc
(如果尚未后台运行),同时连接保持打开状态
壳是一种超级语言,可用于使用多种语言的许多程序聚合复杂的应用程序。
\n