Difference between revisions of "Bash operators"
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 $$ |
+ | |||
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 | + | 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.
Contents
* 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.