SPECIAL CHARACTERS | have a special meaning, the interpreter is the shell |
---|---|
$ | dollar – prompt; indicates readiness of the shell to accept commands (default notation for a regular user) |
# | hash 1) prompt; indicates readiness of the shell to accept commands (default notation for the root user) 2) comment in configuration files and scripts; any word placed after this character is ignored by the system, except for a "#!" (shebang) at the beginning of the script followed by the absolute path to the shell or program used to execute the file |
/ | slash 1) represents the root directory 2) separates directories in the absolute path |
. | dot; represents the current (working) directory |
.. | two dots; represent the parent directory |
- | dash 1) indicates options for the command $ ls -a 2) reads data from STDIN $ gzip -cd file.tar.gz | tar -xf - |
-- | double dash 1) indicates long options for the command $ ls --all 2) indicates the end of command options (the following string is treated as an argument) $ mkdir -- -dir | $ mkdir ./-dir (creates a directory "-dir") |
\ | backslash (at the end of the line); indicates the line break of the command |
> | "greater than" sign – $PS2 (at the beginning of the line); indicates the continuation of the command line |
Pipelines: | sequences of commands separated by one of the following control operators: |
| | pipe; connects the standard output of one command via a pipe to the standard input of another command$ ls -l | grep "^d" | wc -l (prints the number of subdirectories in the working directory) |
|& | 2>&1 | | pipe and ampersand; connect the standard output and standard error of one command via a pipe to the standard input of another command |
Lists: | sequences of commands or pipelines separated by one of the following control operators: |
; | semicolon; indicates the end of the command (the same as the new line)$ cd /tmp; ls -la |
& | ampersand; executes the command in the background in a subshell (useful for running larger jobs; the return code is always zero) |
&& | double ampersand; executes the following command only if the previous command ends successfully (returns a zero exit status)$ mount /mnt/fd && cp -R /mnt/fd /tmp/fd && umount /mnt/fd (mounts the floppy, copies its contents to "/tmp/fd" and unmounts the floppy) |
|| | double pipe; executes the following command only if the previous command fails (returns a non-zero exit status)$ [ $? -eq 0 ] || echo $? (prints the return code of the previous command if it failed) |
Compound commands: | groups of commands that are treated as a single unit |
(<list>) | parentheses; group commands (commands are executed in a subshell)$ (a; b) & c & (commands "a" and "b" are executed sequentially in the background, i.e. one by one, command "c" is executed in parallel) |
{ <list>;} | braces; group commands (commands are executed in the current shell)$ { a; b;} & c & (commands "a" and "b" are executed sequentially in the background, i.e. one by one, command "c" is executed in parallel) $ cd ~/.ssh 2> /dev/null || { mkdir ~/.ssh; cd ~/.ssh;} (changes the current directory to the specified directory, if it does not exist, it is created first) |
PARAMETERS | represent entities that store specific values |
Positional parameters: | numeric parameters inside a shell script representing the arguments passed to the script on the command line in the corresponding order |
<n> | {<n>} | numeric parameter starting from 1 |
Special parameters: | parameters whose contents are read-only |
<parameter> | {<parameter>} | # inside the script it represents the total number of command-line arguments passed to the script, * or @ inside the script it represents all the command-line arguments passed to the script (if the expansion occurs within double quotes, "$*" expands to a single word with each positional parameter separated by a space, whereas "$@" expands each positional parameter to a separate word), 0 inside the script it represents the name of the shell script, on the command line it represents the name of the current shell, $ represents the PID of the current shell, ? represents the return code of the last foreground process, ! represents the PID of the last background process, _ represents the last argument of the last command executed, - represents the current shell options |
Variables: | "storage" of information, consist of the name and assigned value |
<variable>=<value> | definition of a local variable (remains defined in the shell until its termination)$ xy="day" (defines a variable "xy” and assigns it the value "day”) $ working_directory=$(pwd) (assigns a variable the value of the command output) $ PATH="$PATH:~/scripts" (adds the "scripts” directory to the "PATH” variable) $ PS1="[\u@\h \W]\$ " (sets the user's prompt; the "PS1” variable can be defined as follows: \u = user, \h = hostname, \W = working directory) |
Arrays: | data structures that allow multiple values to be stored in a single variable |
<indexed_array>=(<value1> <value2> <value3> ...) | definition of an indexed array (ordered list of items); each value in the array is associated with and accessed by a corresponding numeric index, which starts with 0 for the first item, and increments by 1 for each subsequent item in the array; indexed arrays may optionallly be declared before being defined$ colours=("blue" "red" "light green") | $ declare -a colours=("blue" "red" "light green") (defines an indexed array "colours” and assigns it three different values) $ colours+=("yellow" "white") (appends additional values to the indexed array) $ colours[3]="black" (assigns the value "black" to the item of the indexed array with an index of 3) |
<associative_array>=(<key1> <value1> <key2> <value2> <key3> <value3> ...) | <associative_array>=([<key1>]=<value1> [<key2>]=<value2> [<key3>]=<value3> ...) | definition of an associative array (dictionary – key-value pairs); each value in the array is associated with and accessed by a corresponding unique key; associative arrays must be explicitly declared before being defined$ declare -A hostname_to_ip=(["server1"]="192.168.1.1" ["server2"]="192.168.1.2" ["server3"]="192.168.1.3") (declares and defines an associative array "hostname_to_ip” and assigns it three different keys with their values) $ hostname_to_ip["server4"]="192.168.1.4" | $ hostname_to_ip+=(["server4"]="192.168.1.4") (appends an additional key-value pair to the associative array) |
EXPANSION | replaces specific strings or expressions with their corresponding values or results |
Brace expansion: | process that generates combinations of strings or sequences based on the specified pattern |
{<string>[,<string>]} | braces; define a string (comma-separated strings) to be used in the pattern; the interval of consecutive numbers or letters is expressed by "..”; a prefix or suffix can be added to each string which becomes part of the expression$ mkdir p{la,ri,oi}nt (creates directories "plant”, "print” and "point”) $ mv text{1,2,3,4,5}.txt text_0{1,2,3,4,5}.txt (renames files "textX.txt” to "text_0X.txt”) # mv /etc/pam.d/sshd{,.broken} (renames the file "/etc/pam.d/sshd” to "/etc/pam.d/sshd.broken”) $ touch .{a,b,c,d,e} (creates hidden files of the specified names) $ touch {1..100} (creates one hundred files) $ echo {A..Z} {a..z} {0..9} (displays the interval of the specified characters) $ echo {A..Z}{a..z}{0..9} (displays three-figure combinations of characters in the specified order) |
Tilde expansion: | process that replaces a tilde character with the corresponding user's home directory path |
~ | tilde; represents the logged-in user's home directory ($HOME), ~<user> home directory of the specified user, ~+ working directory ($PWD), ~- previous working directory ($OLDPWD)$ cp ~/file.txt /tmp (copies the "file.txt" file from the user's home directory to the "/tmp" directory) |
Parameter expansion: | process that replaces parameters with their values |
$<n> | ${<n>} | the value of a positional parameter; if a positional parameter consisting of more than a single digit is expanded, it must be enclosed in braces$ ./backup.sh /media/disk-1 (specifies the device for the backup – the script states e.g. "target_dir="$1"”) |
$<parameter> | ${<parameter>} | the value of a special parameter$ echo $? (prints the return code of the last executed command) |
$<variable> | ${<variable>} | the value of a variable; a space is needed after the variable, otherwise it must be enclosed in braces$ echo $xy (prints the value of the variable "xy” – "day”) $ echo it is a new week$xy | $ echo "it is a new week$xy" (prints "it is a new weekday”) $ echo "${xy}long period" (prints "daylong period”) $ echo $SHELL (prints the user's login shell) |
${#<variable>} | the length of the variable's value (number of characters) |
${<indexed_array>[n]} | the value of an indexed array's item; the indexed array must be enclosed in braces$ echo "First colour: ${colours[0]}" (prints "First colour: blue") $ echo ${colours[@]} (prints all items in the indexed array separated by a space) $ for colour in "${colours[@]}"; do echo "Colour: $colour"; done (prints each item in the indexed array on a separate line) |
${#<indexed_array>[@]} | the length of the indexed array's values (number of items) |
${<associative_array>[<key>]} | the value of an associative array's key; the associative array must be enclosed in braces$ echo ${hostname_to_ip["server2"]} (prints "192.168.1.2") $ echo ${hostname_to_ip[@]} (prints all values in the associative array separated by a space) $ echo ${!hostname_to_ip[@]} (prints all keys in the associative array separated by a space) $ for server in "${!hostname_to_ip[@]}"; do echo "$server: ${hostname_to_ip[${server}]}"; done (prints each key with its value in the associative array on a separate line) |
${#<associative_array>[@]} | the length of the associative array's values (number of items) |
Pathname expansion: | process in which metacharacters are used to represent the names of existing files and directories that match the specified pattern |
* | asterisk; matches any number of any characters including spaces, except for a leading dot# rm -Rf /* (removes the contents of the directory) $ ls *' '* (lists files and directories containing a space in the name) |
? | question mark; matches any single character including a space, except for a leading dot# find / -name "*.19??" (finds files and directories with the extension ".19xx") # find / -name "???*" (finds files and directories whose names contain at least three characters) |
[...] | square brackets; match any single character in the list; the list can consist of a specification of individual characters, an interval of characters (contains "-", e.g. A-Z, a-z or 0-9) or a class of characters ([:alnum:], [:alpha:], [:ascii:], [:blank:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:word:], [:xdigit:]); "!" or "^" at the beginning of the list excludes the subsequent characters (groups of characters)$ ls text_[ab].txt (lists files "text_a.txt” and "text_b.txt”) $ find . -name "[a-zA-Z[:digit:]]" (finds files and directories that contain only one lowercase or uppercase letter or digit in the name) $ rm -f .[!.]* (removes all hidden files in the working directory) $ ls ~/.ssh/id_*[!.pub] (lists all private ssh keys) |
Arithmetic expansion: | process that evaluates arithmetic expressions and replaces them with their results |
$((<expression>)) | $[<expression>] | dollar and double parentheses or a dollar and square brackets; the arithmetic expression inside is evaluated and replaced by its result$ echo "2*5=$((2*5))" | $ echo "2*5=$[2*5]" (displays "2*5=10”) $ numbers=(10 20 30); echo "Sum of first two items = $((numbers[0] + numbers[1]))" (displays "Sum of first two items = 30”) # uid=500; for usr in a b c; do useradd -u $uid $usr; uid=$(($uid+1)); done (creates three accounts whose UID starts with 500 and increments by 1) |
Command substitution: | process that replaces a command with its output |
`<command>` | $(<command>) | backquotes (backticks) or a dollar and parentheses; the command inside is processed and replaced with its output$ rpm -qf `which xhost` | $ rpm -qf $(which xhost) (the output of the command "which xhost” is passed to the command "rpm -qf”) |
Process substitution: | process that allows the output of a command to appear as input from a file or output to a file |
<(<list>) | >(<list>) | parentheses and a "less than" or "greater than" sign; execute the list of commands whose output is saved to a special temporary file (named pipe – FIFO) which is then passed as an argument to the current command that expects a file to read from or write to$ diff <(hostname) /etc/hostname (compares the contents of the command output (special file) with the contents of the specified file) $ cat input.txt | tee >(grep a > a.out) >(grep b > b.out) >(grep c > c.out) > /dev/null (filters data from the "input.txt" file based on the specified patterns and redirects them to corresponding separate files) $ echo "$error_message" | tee >(mail -r "$sender" -s "$subject" "$recipients") (displays an error message and sends its contents by email) |
REDIRECTION CHARACTERS | redirect the standard input, output and error of a command |
< | 0< | standard input redirection from a file (STDIN / file descriptor 0)$ mail tom@prompt.cz < list.txt (writes an email to user "tom", the content of which is in the file "seznam.txt") |
<< <delimiter> | standard input redirection from multi-line text (here-document)#!/bin/bash cat <<EOF > /etc/myconfig.conf # My configuration file parameter1=value1 parameter2=value2 parameter3=value3 EOF (redirects multiple lines of text in a script up to the delimiter "EOF" to STDIN of the "cat" command) $ cat <<END > I am $LOGNAME. <-' > END <-' (interactive form) |
<<< <string> | standard input redirection from a single line of text or a variable (here-string)$ wc -w <<< "This is a line of text" (counts the number of words in the string) $ read -a members_array <<< "$members" (reads the space-separated string stored in the variable "$members", splits it into individual words, and stores each word as an element in the array "members_array") |
> | 1> | standard output redirection to a file (STDOUT / file descriptor 1)$ ls -la > dir_contents.txt (redirects the command output to the specified file which is also created, if it exists, it overwrites its contents) $ cat a | tee b > c (redirects the command output to files "b" and "c") $ wc -l < report > /tmp/lines (writes the number of lines of the "report" file to "/tmp/lines") |
2> | standard error redirection to a file (STDERR / file descriptor 2)$ cat file1 file2 > file3 2> /dev/null (writes the contents of files "file1" and "file2" to "file3" and discards the error output of the command) $ make all 2> /dev/pts/3 (displays the standard error output of the command in the specified terminal) |
2>&1 | standard error redirection to standard output (it depends on the order of the STDOUT redirection)$ ls a b > c 2>&1 | $ ls a b &> c (writes STDOUT and STDERR only to file "c") $ ls file1 file2 2>&1 > file3 (displays STDERR on the screen and writes STDOUT to "file3") $ make all 2>&1 | less (useful especially when a process prints multiple error messages) |
&> | standard output and standard error redirection to a file# yum install -y libstdc++.x86_64 &> /dev/null (discards all command output) |
>> | standard output redirection to the end of a file# echo 'ALL ALL=!SUDOSUDO' >> /etc/sudoers (appends the command output to the end of the specified file, if the file does not exist, it is created) |
2>> | standard error redirection to the end of a file# fsck /dev/sda1 2>> error (appends the standard error output of the command to the end of the specified file, if the file does not exist, it is created) |
QUOTING CHARACTERS | suppress the meaning of special characters |
\ | backslash (escape character); prevents the shell from interpreting the following single character$ echo \$car (prints "$car”) |
'...' | single quotes; prevent the shell from interpreting any string inside the quotes; single quotes, however, cannot be enclosed within themselves$ echo '$car '(prints "$car”) $ echo '\$car '(prints "\$car”) $ echo ''$car'' (prints "jeep”) |
"..." | double quotes; similar to single quotes, but they allow the interpretation of substitution characters and "$" and "`" characters, "\" expands only when followed by "$", """, "`", "\" and a new line; double quotes, however, cannot be enclosed within themselves$ echo "$car" (prints "jeep”) $ echo "\$car" (prints "$car”) $ echo ""$car"" (prints "jeep”) |
REGULAR EXPRESSIONS (extended) | represent patterns that are used to match specific strings in the text, the interpreter is the program |
---|---|
Special characters: | specify the character of the expression |
. | dot; matches any single character including a space |
[...] | square brackets; match exactly one character in the list, "-" specifies an interval of characters (e.g. A-Z, a-z or 0-9), "^” at the beginning of the list excludes the subsequent characters |
[[:alpha:]] / [a-zA-Z] | alphabetic characters |
[[:lower:]] | lowercase letters |
[[:upper:]] | uppercase letters |
[[:digit:]] / [0-9] | numeric characters |
[[:alnum:]] / [0-9a-zA-Z] | alphanumeric characters |
[[:punct:]] | punctuation characters |
[[:print:]] | printable characters |
[[:blank:]] | space or tabulator |
(...) | parentheses; group characters |
| | pipe (logical OR); separates searched patterns |
\ | backslash; suppresses the meaning of the following special character |
Positional characters: | specify the position of the expression |
^ | caret; matches the beginning of a line |
$ | dollar sign; matches the end of a line |
\<...\> | escaped angle brackets; match a pattern that is not surrounded by a letter, number or underscore |
Quantifiers: | specify the number of repetitions of the previous expression |
? | question mark; matches 0 or 1 times |
* | asterisk; matches 0 or more times |
+ | plus; matches 1 or more times |
{<n>} | number in braces; matches exactly n times |
{<m>,<n>} | numbers in braces separated by a comma; matches at least m times, but not more than n times |
{<m>,} | number and a comma in braces; matches at least m times |
{,<n>} | comma and a number in braces; matches at most n times |
Regular expression: | matches: |
a. | "a" + any single character |
a+b | "ab", "aab", "aaab" ... |
a\+b | "a+b" |
s?care | "scare" or "care" |
auto(mobile)? | "auto" or "automobile" |
micro(phone|scope) | "microphone" or "microscope" |
^(Subject|From): | a line starting with the string "Subject:" or "From:" |
ha{1,3} | "ha" or "haha" or "hahaha" |
<T[DH]> | "<TD>" or "<TH>" |
\<a.*a\> | a string starting and ending with "a" |
\[[a-zA-Z]\] | any letter enclosed in "[]" |
[0-9]+ | at least one digit |
[0-9]|[1-9][0-9] | a range of numbers "0"–"99" |
[0-9]{2} | a range of numbers "00"–"99" |
(19|20)[0-9]{2} | a range of numbers "1900"–"2099" |
[0-9a-fA-F]|[1-9a-fA-F][0-9a-fA-F]+ | hexadecimal numbers |
^$ | an empty line |
[.^az\-] | a dot, caret, "a", "z", backslash or dash |
[^ ,.]+ | a string that does not contain a space, comma, or dot |
.+0$ | a line ending with "0" preceded by at least 1 character |
^P.*(0[1-9])$ | a line starting with "P" and ending with "01"–"09" |
(\(?(\+|00)[0-9]{1,4}\)?)?([- ]?[0-9]{2,4}){2,4}([[:blank:]]|$)+ | any phone number |
[a-zA-Z0-9_.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} | any email address |
https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(/[^ ]*)? | any web address |