If you would like to look at a book I suggest:
www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf
Sommaire
HOME
By default your HOME directory is the directory in which you "land" when you log in. The path of this directory is usually:
/home/username
It is also stored in the HOME environment variable (see further down):
echo $HOME
In general there is not much space in your HOME but therefore, at UQAM, a backup of everything you keep under your HOME is done every 3 hours. We also keep daily and weekly backups for up to 4 weeks. You if you ever remove something by accident or if the machine or disk unit crashes, there will still be a copy of everything you had in your HOME.
Therefore, it is strongly suggested that you keep everything which is small and important in your HOME! Like programs, scripts, configuration files.
Check out the following link to find out how to retrieve data from the home backup.
Shell
A shell is a UNIX system command processor. Basically, it is a command language to tell the system what to do. There are two major shell (command interpreter) families:
Bourne, Korn, Bash Shell
C Shell
The syntax of shell commands can vary from one shell to another.
At UQAM we use the Bourne Again Shell (bash). Therefore all commands below are bash commands.
Syntax of a shell command
command-name [ -option(s) filename(s) or arguments ]
Everything in square brackets [] is optional.
Example: ls -l filename
...
ls -l -t -r
is the same as
ls -lrt
In case you have a file name or an argument starting with a '-' you can use '--'. The command will NOT interpret anything following a '--' as an option/key.
For example if you are using 'grep' to look for '-a' in a file you could type:
$ grep -iw -- -a filename
For more detailed explanations about Program Argument Syntax Conventions, please click on the here.
Documentation of specific commands - man & whatis
whatis command - displays a one-line summary about command
man command - displays on-line manual pages about command
'man' can be use on almost all of the shell commands listed below to get the complete description of the command.
To quit 'man' press 'q'.
Shell commands are case sensitive
Type commands exactly as shown; most shell commands are lower case. File and directory names can be lower, upper, or mixed case but must be typed exactly as listed.
Most important shell commands
...
> | Redirects the output of a command to a file, overwriting the file if it exists |
>> | Redirects the output of a command to a file, appending to the file if it exists |
< | Redirects input from a file to a command |
<< | Redirects a string into the standard input of a command |
Wild cards
Wildcards
Wildcards are "place holder" for one or many characters. A number of characters are interpreted by shell before any other action takes place. These characters are known as wildcard characters. Usually these characters are used in place of filenames or directory names.
* | An asterisk matches any number of characters in a filename, including none. |
? | The question mark matches any single character. |
[ ] | Brackets enclose a set of characters, any one of which may match a single character at that position. |
- | A hyphen used within [ ] denotes a range of characters. |
^ | Negates the sense of a match |
~ | A tilde at the beginning of a word expands to the name of your home directory. If you append another user's login name to the character, it refers to that user's home directory. |
Here are some examples for the usage of wild cardswildcards:
- cat c* : displays any file whose name begins with c including the file c, if it exists.
- ls *.c : lists all files that have a .c extension.
- cp ../rmt? . : copies every file in the parent directory that is four characters long and begins with rmt to the working directory. (The names will remain the same.)
- ls rmt[34567] : lists every file that begins with rmt and has a 3, 4, 5, 6, or 7 at the end.
- ls rmt[3-7] : does exactly the same thing as the previous example.
- ls ~ : lists your home directory.
- ls ~username : lists the home directory of the guy with the user name username.
...
echo "message" : displays/prints 'message'.
Examples:
echo Hello
Hello
echo "Hello there"
Hello there
...
printf
printf : produces produces output according to a format.
...
history : lists the most recent commands
Exit/Close a terminal or
...
process (script, command)
The easiest way to exit a script/process is by pressing the keys Ctrl-c.
The easiest way to close a terminal is by pressing the keys Ctrl-d.
...
'\' prevents the following character from being "interpreted". There are several "special characters" (see above) in shell which have a certain "meaning" and functions function as little "commands".
Unfortunately '\' has different meanings depending on where/how it gets used.
Examples:
$ person=Alex
$ echo $person
Alex
$ echo \$person
Examples:
person=Alex
echo $person
Alex => Evaluation done !!!
echo \$person
$person => No evaluation done !!!
$ - Because of the back slash
echo "\$person"
$person => No evaluation done !!!
$ - Because of the back slash
echo '\$person'
Alex $person => Evaluation No evaluation done !!!
- Because of the single quots
When used as the very last character in a line it will surpress suppresses the "new line".
$
Command I/O
> :command output redirection (create new)
>> : command output redirection(append)
< :command input redirection (from file)
<< : command input (from script or standard input)
Example:
Volet |
---|
cat > text_file << EOF |
...
Hello, \ |
...
how are you? |
...
EOF |
...
cat text_file |
...
Hello, how are you? |
...
null device
/dev/null or the null device is a special "file" that discards all data written to it but reports that the write operation succeeded.
File Operations
Search for Patterns in Files
grep search-string filename(s) : to find and type out lines containing the string in a file
Most useful search options:
-i : case insensitive search
-w : whole words only
-v : invert match; type out lines that do NOT contain the string (invert the search)
-c : count the number of lines that contain a match
Search for files & directories
find directory-name [-name (part_of_)name]
Useful for finding particular files or directories. 'find' descends the directory tree beginning at directory-name and locates files/directories that meet the search criteria
'find' is a very powerful and useful command. Use 'man find' to find out more.
Most useful search options:
-name ... | search for files/directories with a certain name or part of name. Wildcards can be used. |
-type ... | search for certain files types only. 'd' → directories; 'f' → files; 'l' → symbolic links |
-exec ... | execute the following command on each found file/directory. '{}' serves as placeholder for found files/directories needs to get terminated with '\;' |
For example, it can
Command I/O
...
null device
...
File Operations
Search for Patterns in Files
...
Search for files
find pathname -name search-string
Useful for finding particular files. find descends the directory tree beginning at each pathname and locates files that meet the specified conditions. Wild cards can be used in the search string.
find is a very powerful and useful command. Use 'man find' to find out more.
It can for example also be used in combination with 'grep':
$
find . -name '*.scrsh' -exec grep case {} \;
The above command will print all lines containing the word 'case' of files with end on '.scrsh'.
Counting words/lines/characters in a file
wc filename(s) : counts the number of words, lines, and characters in a file
Options
Most useful search options:
-l : count lines lines
-c : count characters characters
-w : count words words
Pipe
| : (pipe) redirect standard output of first command to standard input of second command
Example:
$ ls -1 | wc -l : count the number of files in a directory
Compare files
difffilename1 filename2 : compares contents of two files on a line-by-line basis
xxdiff filename1 filename2 [filename3] : graphically compares contents of two or three files on a line-by-line basis. Can also be used to edit files!
xxdiff directory1 directory2 : graphically compares contents of two directories
xxdiff can also be used to edit files!
tkdifffilename1 filename2 : graphically compares contents of two files on a line-by-line basis. Use on guillimin onstead of 'xxdiff'.
File Transfer
File Transfer
While 'cp' can only be used to copy files and directories on the same machine, there are tools that can copy files and directories from one machine to another.
rsync
'rsync' stands for remote sync. It is a remote and local file and directory synchronization tool.
Examples:
rsync : a fast, versatile, remote (and local) file/directory-copying tool
Usage:
rsync origin destination
rsync user@origin username@remote_origin_machine:origin destination
rsync origin user@destination origin username@remote_destination_machine:destination
'origin' and 'destination' can be file(s) and/or directories.
Only the origin or the destination machine can be a nother machine, not both.
Options:
...
files and/or directories.
Only either the origin or the destination machine can be another machine, not both.
The 'username@' only needs to be given for the remote machine and only if the username is different from the one on the local machine.
The default directory on the remote machine is the home directory. If the remote file/directory is not in the home directory a path need to be specified, either from the home directory or a full path.
Most useful options:
-v | verbose |
-r | Recursively recursively copy entire directories |
-u | update, forces rsync to skip any files which exist on the destination and have a modified time that is newer than the source file. |
-l | links, when symlinks are encountered, recreate the symlink on the destination |
-L | copy-links, When symlinks are encountered, the item that they point to (the referent) is copied, rather than the symlink. |
-t | preserves preserve time |
-p | preserves permissionspreserve permissions - do not use when copying to clusters of the Alliance!!! |
scp
scp : secure copy (remote file copy program)
Usage: similar to rsync aboveOptions
Most useful options:
-r | Recursively copy entire directories. Note that scp follows symbolic links encountered in the tree traversal. |
ftp / sftp
Also see:
sftp : secure file transfer program
ftp : Internet file transfer program
wget
wget : web downloader
GNU Wget is a free utility for non-interactive download of files from the Web.
Example:
$ wget www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf
File archiving and compressions
tar
"Tape archive" : tape archive, can create, add to, list, and retrieve files form an archive file (a collection of files or even whole directory trees archived together as one file).Options:
Most useful options:
-f | followed by name of tar-file => needs to be the last key! | ||||
-c | create archive | ||||
-x | extract files | ||||
-z | (de)compresses files while (un)archiving them! | ||||
-v | verbose | -c | create archive|||
-t | table of contents | -x | extract files | -f | followed by name of tar-file - lists content of tar file |
-t | preserves time |
Examples:
Create Create tar-file: tar -cvf cvzf tar-filename.tar filenames_to_archive
Unarchive tar-file: tar -xvf xvzf tar-filename.tar
gzip
...
/ gunzip
Compress : compress resp. expand files.
gzip gzip filename : compresses the file filename. Whenever possible, each file is replaced(!) by one with the same name and the extension .gz
gunzip filename.gz : uncompresses the gz-file again.
Good to save space!
zip
...
/ unzip
Package : package and compress resp. unarchive and uncompress (archive) files and directories.
zip zip-file.zip file file/directory_list : archives and compresses all files/directories in file_list into zip-file.zip. Leaves original files untouched.
unzip zip-file.zip : unarchives and uncompresses all files/directories in zip-file.zip.
unzip zip-file.zip aaa filename : unarchives and uncompresses only file 'filename' aaa fromzip-file.zip. Wildcards can get used.
Cursor movements in command line
emacs mode:
<Esc> . |
...
repeat last word of previous command |
...
Ctrl-a |
...
jump to beginning of line |
...
Ctrl-e |
...
jump to end of line |
...
Ctrl-r |
...
search backwards in command history | |
Ctrl-c |
...
interrupt current command/process |
...
Conditional structures
if-then-else
Volet |
---|
if |
...
expression_1; then Statement(s) to be executed if expression 1 is true [elif expression_2; then Statement(s) to be executed if expression 2 is true elif expression_3; then Statement(s) to be executed if expression 3 is true else Statement(s) to be executed if no expression is true] fi |
'elif expression ; thenelif' and 'else' are optional!!!expressions can look like this
Example 'expressions':
Arithmetic expression examples ( a=2 ):
(( a == 3 ))
(( b != 3 ))
(( $a >= 3 ))
In Arithmetic expressions '(( ... ))' it is not necessary to put the '$' infront in front of variables since strings are not allowed so all strings are assumed to be variables anyways.
String expressions examples ( abc="Bonjour" ):
equal:
[[ "$abc" == "Hello" ]]
not equal:
[[ "$abc" != "Hello" ]]
The more common but less recomended recommended way is:
[ $a -le 3 ]
resp.
[ "$abc" -nq "Hello" ]
Note: It is mandatory to keep a 'space' just before and after the double and single square brackets!!!
and: &&
or: ||
If you want to know more about the comparison operators try:
$ man test
or
$ man bash -> CONDITIONAL EXPRESSIONS
case-statement
A case statement is a conditional control structure that allows a selection to be made between several sets of program statements. It is a popular alternative to the if-then-else statement when you need to evaluate multiple different choices.
Volet |
---|
case test_string in pattern_1 | pattern_2 ) statement(s) ;; pattern_ |
...
3 ) statement(s) ;; |
...
* ) default_statement(s) ;; esac |
...
The pipe character '|' serves here as an "or".
The last line of each statement needs to be finished with ';;' at the end.
Examples:
Volet |
---|
|
...
|
...
|
...
|
...
|
...
|
...
|
Loops
Loops can be used to execute (parts of) code repeatedly.
for-loop
Loop over different fixed elements
Volet |
---|
...
for var in word1 word2 ... wordN; do Statement(s) to be executed for every word |
...
done |
Examples:
Loop over numbers:
Volet |
---|
for hour in 00 06 12 18 ; do echo |
...
$hour done |
Loop over files:
Volet |
---|
touch dm_01 dm_02 for fine in dm* ; do echo $file done |
while-loop
Repeat statement(s) while 'condition' is true.
Volet |
---|
while |
...
condition ; do Statement(s) to be executed while expression is true done |
Example:
Volet |
---|
a=1 while (( a <= 10 )) ; do echo $a a=$(( a + 1 )) # increase the loop parameter done |
You One can also use a while-loop to read lines from an ASCII file.
Example:
Volet |
---|
...
cat > text_file << EOF > Hello > How are you? |
...
EOF |
...
while read line ; do echo $line; done < text_file Hello How are you? |
break
...
& continue
To interrupt a loop you can use 'break' and 'continue'.
break interrupts the loop
continue interrupts the current cycle of the loop
Manipulating Variables
Example string:
$ string="ABC_abc_123"String
Get string length:
$ echo ${#string}
Remove patterns from string
# |
...
removes minimal matching prefixes |
## |
...
removes maximal matching prefixes |
% |
...
removes minimal matching suffixes | |
%% |
...
removes maximal matching suffixes |
:s: |
...
n | get 'n' |
...
characters starting from position 's' (first position is 0) |
Look at these examples and you will understand the meaning of the above:
$ string="ABC_abc_123"
$ echo ${string#*_}
abc_123 123 => removes everything before first occurance of '_'
$ echo ${string##*_}
123 => removes everything before last occurance of '_'
$ echo ${string%_*}
ABC_abc abc => removes everything after last occurance of '_'
$ echo ${string%%_*}
ABC => removes everything after first occurance of '_'
$ echo ${string:s:n}
abc => gets n characters, starting from position s
cut
Cut out/print part of the content of a variable:
cut prints selected parts of a string.
Options
Most useful options:
-c | select only these characterscharacters according to their position in the string | |
-d | delimiter=DELIM; use DELIM instead of TAB for field delimiter | |
-f | select only these fields/columns |
Examples:
$ abc="I am hungry"
$ echo $abc | cut -c 6-9
hung => returns characters 6-9
$ echo $abc | cut -c 6-
hungry => returns characters 6 to end
$ echo $abc | cut -d' ' -f 3
hungry => returns 3rd element with ' ' used as seperator
$ abc="I am hungry. Are you?"
$ echo $abc | cut -d. -f 2
Are you? => returns 2nd element with '.' used as seperator
set
When you call calling set without options but with one or more arguments, it sets the values of the command line argument variables ($1-$9$n) to its arguments.
Examples:
$ abc="I am hungry"
$ set $abc
$ echo $3
hungry
When options are specified, they set or unset shell attributes.
Options:
-x | expands each simple command This is very useful for debugging scripts!!! | |
+x | no expanding of commands anymore |
For more options check man page: man set
Examples:
$ abc="I am hungry"
$ set -x
$ abc="I am hungry"
+ abc='I am hungry'
& -> Send job in background
You can send a job in the background by adding a '&' at the end of the command line.
This is useful to get the prompt back - beeing being able to continue using the window - when calling a program whic which opens a nother another window, like for example Matlab, emacs, xrec.
Example:
$ matlab emacs &
In case you forgot to add the '&' you can still send an already launched job into the background with 'Ctrl-z' followed by 'bg' (for background):
Example:
$ emacs
Ctrl-z
[1]+ Stopped emacs
$ bg
bg
[1]+ emacs &
Check and kill running processes
ps reports a snapshot of the current processesOptions
Most useful options:
-e | select all processes | |
-f | do full-format listing | |
-u userlist | this selects the processes whose effective user name or ID is in userlist |
Try for example:
ps -fu $USER
Since the lines can get pretty long you can also pipe the output into less to see the full lines, for example:
$ ps -fu $USER | less
Also have a look at the 'STIME' to see how old the processes are.
If ever you need to kill one of these jobs you can use 'kill' followed by the process ID, 'PID' (second column).
If a normal 'kill' does not work try 'kill -9' followed by the 'PID'.:
kill -9 PID