Bash operators

From Linuxintro
Revision as of 13:22, 21 March 2021 by ThorstenStaerk (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

You have a shell script and wonder what these operators do? Then this article is for you.

* and ?

You may already know these used for so called "shell globbing" (pattern matching). * replaces an arbitrary amount of characters (including none), while ? replaces exactly one character.

These wildcards are actually bash operators! Imagine, we have the files a1, a2:

cp a*

now is a valid bash command which overrides one of these files with the other one.


The operator $() in the bash shell is replaced by the output of the command enclosed in the parentheses. It is equivalent to backticks (``), but can be cascaded more easily.


rpm -ql $(rpm -qa)
for i in $(seq 1 1 100); do echo $i; done


The operator $(()) in the bash shell is replaced by the arithmetic result of the expression enclosed in the parentheses.


# echo $((2*2))


The operator $$ delivers the id of the currently-running process.


# kill -9 $$

kills the current process


The operator $! delivers the id of the process that has most recently sent to the background.


# xosview & sleep 5; kill $!

shows xosview for 5 seconds and stops it

> and >>

> and >> can be used to redirect the output (only stdout, not stderr, for that see below) of a command to a file. The difference between them is, that >> appends to the given files, while > will truncate it.


ls -alh > files-in-directory.txt
ls -alh /otherdir >> files-in-directory.txt  # Append list of files in other directory

2> or 2>>

stderr can be redirected by using 2> or 2>>.

But sometimes, you need stderr to be included in stdout for certain purpose, e.g. when another program is parsing/logging only stdout and you need errors to be in there, too. In these cases, you can redirect stderr to stdout with "2>&1". (Of course, it is also possible to redirect stdout to stderr this way, if you need to silence a program on stdout for some purpose).


cat notexisting 2> test  # Writes "File or directory not found." to test
cat notexisting 2>&1  # Outputs "File or directory not found." to stdout


| is used to pipe the stdout of one programm to the stdin of another one.

tail -n 100 foo | sort -r  # Reverse sort the last 100 lines of the file foo


&& evaluates the binary result of the command left of it and ands it with the binary result right of it if it is not already false, where false!=0. In other words, if you write

command1 && command2

command2 will only be executed if command1 returned success.

See also