Reputation: 7788
TL;DR; What are shell scripts? Is it a programming language / is there a programming language we use in shell scripts?
disclaimer: a bit offtopic
So bash stands for Bourne-again shell. A (Unix) Shell is a command line user interface or maybe one could call it an interpreter (?)
So I'm filling out an application for a new job and you get asked for experience of different programming languages and then there is this box at the bottom other experiences - I started typing python 2.7, powershell, bas... Wait! bash isn't a programming language - it's a console that can execute shell scripts... so... eh.... oh my god I have no idea!
Upvotes: 87
Views: 103798
Reputation: 70742
Coming to this SO question somewhat late, reading fedorqui's answer:
a programming language through which a user communicates with the operating system or an application
I think "programming language" is not exactly same thing as "command language", meaning a language intended to run commands.
To be more detailed I would precise:
a programming language through which a user (real user or daemon) could interact with operating system, hardware devices, peripheral devices and applications, even planning applications to communicate in between, with devices, other applications and/or via network or local sockets... And even more! The shell concept are comming from posix after strong engineers studies about creating something simple, reliable and evolutive.
Note: The concept Everything is a file, from posix, is the first key, making all this possible!
yes, you could... I personally wrote a lot of libraries around bash (around monitoring, backups, sysadmin, networking, etc.), but clearly for writing a program, you have to use a real programming language.
bash is a shell (like sh and others shell)! Meaning an overall aggregator language, or a super language.
First goal is to be an interactive command processor, in order to use and maintain posix systems.
One of its first applications was to create wrappers in order to prepare an environment for running programs written in other languages.
So this command processor is ideal for systems, filesystems, networks and a lot of administration tasks, because it's interactive and using its history makes the job of creating scripts just easy.
As this language is intended to deal with ios, forks, fifos and because posix said everything is a file, a shell script could normally deal with everything, directly or by using other tools/binaries/applications. This language is intended to create condition, execution groups and interaction around everything.
This could open a lot of interactivity between systems, networks, iot, etc...
A script could for example (see further my shell connector demo).
1. Open DB, SSH connection and log file simultaneously as file descriptors.
2. Create SQL (temporary or not) table
3. Doing loops, checking for events on DB, SSH connections or other things...
4. Interact with DB and/or SSH...
5. Close all file descriptors (DB, SSH, log file, etc)
Comments on Mecki's answer show a good sample of how bash could be used to deal with other binaries (bc
for Mandelbrot)...
Where shell is used to run bc
and aggregate its answers.
bc -l
to submit all calculations drops execution time down to 8 minutes.bc
, drops execution time down to 8 seconds.bc
for computing many dots simultaneously (parallel-processing), in order to use multi-core, dividing execution time approximately by available cores... (Thanks to Léa Gris for contributing, helping making this posix compatible, multi-core idea and adding colors, making this near beautiful, I can't resist to post their result)
I wrote some scripts showing this powerful parallelization capabilities:
sed
, date
, bc
and paste
), than using perl.ping
simultaneously and draw a dynamic graphic using gnuplot
, while staying interactive.sqlite
, date
and bc
as background co-process if run.In order to do some monitoring, checks against differences or so one, we could create a script to open many simultaneous connections
to many differents targets, using one of netcat
, sql-client
, ftp
, open-ssl s_client
, ssh
or else...
... with the ability of running sha1sum
, grep
, xmlint
or bc
(if not already backgrounded) when required, while connections stays open...
shell is a super-language, useful to aggregate a complex application using many programs in various languages.
Upvotes: 9
Reputation: 132879
There is no perfect definition of what a programming language really is but you can say that every language that is Turing-complete is a programming language in the sense of that every thinkable program can theoretically be written in it (even if it may be awkward to do so and even if it would be horribly slow to run). And Bash is Turing-complete, so there is nothing that could not be programmed in Bash.
The problem with Bash, shells in general is, that it lacks a lot of base functionality, thus when writing scripts for them, you often in fact call external programs to perform the desired work. But that's only taking a shortcut. E.g. if you'd need floating point functionality in a shell, you could actually implement it. It would be possible to write a full IEEE 754 standard implementation in everything that is Turing-complete. In practice such an implementation would be huge, require tons of memory and be horribly slow, so one better calls bc
for that. But even implementing bc
entirely in bash would be possible.
Here's a bash script I've once written that draws a Mandelbrot set to console. You better be prepared to get some cups of coffee if you want to see the final result, it's going to be a very long night:
#!/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
For those who cannot wait that long, the result should look like this:
*
*
*
*
*
***
*****
*****
***
*
*********
*************
***************
*********************
*********************
*******************
*******************
*******************
*******************
***********************
*******************
*******************
*********************
*******************
*******************
*****************
***************
*************
*********
*
***************
***********************
* ************************* *
*****************************
* ******************************* *
*********************************
***********************************
***************************************
*** ***************************************** ***
*************************************************
***********************************************
*********************************************
*********************************************
***********************************************
***********************************************
***************************************************
*************************************************
*************************************************
***************************************************
***************************************************
* *************************************************** *
***** *************************************************** *****
****** *************************************************** ******
******* *************************************************** *******
***********************************************************************
********* *************************************************** *********
****** *************************************************** ******
***** *************************************************** *****
***************************************************
***************************************************
***************************************************
***************************************************
*************************************************
*************************************************
***************************************************
***********************************************
***********************************************
*******************************************
*****************************************
*********************************************
**** ****************** ****************** ****
*** **************** **************** ***
* ************** ************** *
*********** ***********
** ***** ***** **
* * * *
It shall resemble this kind of thing turned by 90 degree (and a bit squeezed):
Upvotes: 19
Reputation: 27567
Bash most certainly is a programming language, one that specialises in the unix/linux shell scripting. It's turing complete so you could (theoretically) write any program in Bash.
Upvotes: 29
Reputation: 289505
We can say that yes, it is a programming language.
According to man bash
, Bash is a "sh-compatible command language". Then, we can say a "command language" is "a programming language through which a user communicates with the operating system or an application".
From man bash
:
DESCRIPTION
Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates useful features from the Korn and C shells (ksh and csh).
http://www.gnu.org/software/bash/
Bash is the GNU Project's shell. Bash is the Bourne Again SHell. Bash is an sh-compatible shell that incorporates useful features from the Korn shell (ksh) and C shell (csh). It is intended to conform to the IEEE POSIX P1003.2/ISO 9945.2 Shell and Tools standard. It offers functional improvements over sh for both programming and interactive use. In addition, most sh scripts can be run by Bash without modification.
And a UNIX shell is... http://en.wikipedia.org/wiki/Unix_shell
A Unix shell is a command-line interpreter or shell that provides a traditional user interface for the Unix operating system and for Unix-like systems. Users direct the operation of the computer by entering commands as text for a command line interpreter to execute, or by creating text scripts of one or more such commands. Users typically interact with a Unix shell using a terminal emulator, however, direct operation via serial hardware connections, or networking session, are common for server systems.
Upvotes: 86