Difference between revisions of "Bash operators"

From Linuxintro
imported>ThorstenStaerk
m
 
(12 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 +
You have a shell script and wonder what these operators do? Then this article is for you.
 +
 
= * and ? =
 
= * 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.
 
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:
 
These wildcards are actually bash operators! Imagine, we have the files a1, a2:
 
  cp a*
 
  cp a*
 +
 
now is a valid bash command which overrides one of these files with the other one.
 
now is a valid bash command which overrides one of these files with the other one.
  
Line 10: Line 12:
 
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.
 
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.
  
Examples:
+
Examples
 
  rpm -ql $(rpm -qa)
 
  rpm -ql $(rpm -qa)
  
Line 26: Line 28:
  
 
Example:
 
Example:
  # [[kill]] -9 $$
+
  # kill -9 $$
 +
 
 
kills the current process
 
kills the current process
  
Line 34: Line 37:
 
Example:
 
Example:
 
  # [[xosview]] & [[sleep]] 5; [[kill]] $!
 
  # [[xosview]] & [[sleep]] 5; [[kill]] $!
 +
 
shows xosview for 5 seconds and stops it
 
shows xosview for 5 seconds and stops it
  
Line 56: Line 60:
 
= | =
 
= | =
 
| is used to pipe the stdout of one programm to the stdin of another one.
 
| 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 file
+
  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. In other words, if you write  
+
&& 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
 
  command1 && command2
 +
 
command2 will only be executed if command1 returned success.
 
command2 will only be executed if command1 returned success.
 +
 +
= See also =
 +
* [[bash operator]]
 +
* [[shell Programming]]

Latest revision as of 13:22, 21 March 2021

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.

Examples

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.

Examples:

# echo $((2*2))
4

$$

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

Example:

# kill -9 $$

kills the current process

$!

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

Example:

# 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.

Examples:

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).

Examples:

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