Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

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.

...

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:

...

v
-ffollowed by name of tar-file => needs to be the last key!                             
-cverbose-ccreate archive
-txextract filestable of contents
-xextract filesz (de)compresses files while (un)archiving them!
-vverbose
-ttable of contents - lists content of tar file-ffollowed by name of tar-file                                    
-tpreserves 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 filename : 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

zip / unzip

Package and compress resp. unarchive and uncompress (archive) files and directories.

    zip      zip-file.zip 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 'aaa filename' 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

'elifexpression ; then' 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

#  Determine number of days per month

...

case"$month"in
    01|03|05|07|08|10|12)days=31;;
    04|06|09|11)          days=30;;

...

    02)                   if [$(( ${year} % 4 ))-eq0];then
                             days=29

...

                          else

...

                             days=28

...

                          fi;;

...


esac

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:

...

nget '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:string.

Most useful options:

    -cselect only these characterscharacters according to their position in the string
-ddelimiter=DELIM; use DELIM instead of TAB for field delimiter
-fselect 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:

    -xexpands each simple command
This is very useful for debugging scripts!!!
+xno 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:

    -eselect all processes
-fdo full-format listing
-u userlistthis 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