Update shell_cheatsheet.md
[swc-modular-shell.git] / shell_cheatsheet.md
1 # Basic Shell Commands
2 ***
3
4 ## 1. Shell Basics:
5
6 | Command        | Definition                                                                                                     |
7 |----------------|----------------------------------------------------------------------------------------------------------------|  
8 | `.`            | a single period refers to the current directory                                                                |  
9 | `..`           | a double period refers to the directory immediately above the current directory                                |  
10 | `~`            | refers to your home directory. _Note:_ this command does NOT work on Windows machines (Mac and Linux are okay) |  
11 | `cd ./dirname` | changes the current directory to the directory `dirname`                                                       |  
12 | `ls -F`        | tells you what files and directories are in the current directory                                              |  
13
14
15
16 ## 2. Creating Things:
17 ### a) How to create new files and directories..
18
19 | Command           | Definition                                                                                                                                                                                                                                                                                                                                            |  
20 |-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|  
21 | `mkdir ./dirname` | makes a new directory called dirname below the current directory. _Note:_ Windows users will need to use `\` instead of `/` for the path separator                                                                                                                                                                                                    |  
22 | `nano filename`   | if `filename` does not exist, `nano` creates it and opens the `nano` text editor. If the file exists, `nano` opens it. _Note:_ _(i)_ You can use a different text editor if you like.  In gnome Linux, `gedit` works really well too. _(ii)_ `nano` (or `gedit`) create text files. It doesn't matter what the file extension is (or if there is one) |  
23
24 ### b) How to delete files and directories...
25 #### _Remember that deleting is forever. There is NO going back_
26
27 | Command           | Definition                                                                                                       |  
28 |-------------------|------------------------------------------------------------------------------------------------------------------|
29 | `rm ./filename`   | deletes a file called `filename` from the current directory                                                      |  
30 | `rmdir ./dirname` |  deletes the directory `dirname` from the current directory. _Note:_ `dirname` must be empty for `rmdir` to run. |  
31
32 ### c) How to copy and rename files and directories...
33
34 | Command | Definition                                                                                                                                                                                                                    |  
35 |---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|  
36 | `mv tmp/filename .` | moves the file `filename` from the directory `tmp` to the current directory. _Note:_ _(i)_ the original `filename` in `tmp` is deleted. _(ii)_ `mv` can also be used to rename files (e.g., `mv filename newname` |  
37 | `cp tmp/filename .` | copies the file `filename` from the directory `tmp` to the current directory. _Note:_ _(i)_ the original file is still there                                                                                      |  
38
39
40
41 ## 3. Pipes and Filters
42 ### a) How to use wildcards to match filenames...
43 Wildcards are a shell feature that makes the command line much more powerful than any GUI file managers. 
44 Wildcards are particularly useful when you are looking for directories, files, or file content that can
45 vary along a given dimension.  These wildcards can be used with any command that accepts file names or 
46 text strings as arguments.
47
48 #### Table of commonly used wildcards 
49
50 | Wildcard               | Matches                                        |  
51 |------------------------|------------------------------------------------|  
52 | `*`                    | zero or more characters                        |  
53 | `?`                    | exactly one character                          |  
54 | `[abcde]`              | exactly one of the characters listed           |  
55 | `[a-e]`                | exactly one character in the given range       |  
56 | `[!abcde]`             | any character not listed                       |  
57 | `[!a-e]`               | any character that is not in the given range   |  
58 | `{software,carpentry}` | exactly one entire word from the options given |  
59
60 See the cheatsheet on regular expressions for more "wildcard" shortcuts.
61
62 ### b) How to redirect to a file and get input from a file ...
63 Redirection operators can be used to redirect the ouput from a program from the display screen to a file where it is saved (or many other places too, like your printer or to another program where it can be used as input).
64
65
66 | Command | Description                                                                                                                     |  
67 |---------|---------------------------------------------------------------------------------------------------------------------------------|  
68 | `>`     | write `stdout` to a new file; overwrites any file with that name (e.g., `ls *.md > mardkownfiles.txt`)                          |  
69 | `>>`    | append `stdout` to a previously existing file; if the file does not exist, it is created (e.g., `ls *.md >> markdownfiles.txt`) |  
70 | `<`     | assigns the information in a file to a variable, loop, etc (e.g., `n < markdownfiles.md`)                                       | 
71
72
73
74 #### b.1) How to use the output of one command as the input to another with a pipe...
75 A special kind of redirection is called a pipe and is denoted by `|`. 
76
77
78 | Command | Description                                                                                                                                           |  
79 |---------|-------------------------------------------------------------------------------------------------------------------------------------------------------|  
80 | `|`     | Output from one command line program can be used as input to another one (e.g. `ls *.md | head` gives you the first 5 `*.md` files in your directory) |  
81
82
83
84
85 ##### Example:   
86
87     ls *.md | head | sed -i `s/markdown/software/g`
88    
89 changes all the instances of the word `markdown` to `software` in the first 5 `*.md` files in your current directory.
90
91
92  
93
94 ## 4. How to repeat operations using a loop...
95 ### a) For loop
96
97     for varname in list
98     do
99         command 1
100         command 2
101     done
102
103 where,
104
105 *  `for`, `in`, `do`, and `done` are keywords
106 *  `list` contains a list of values separated by spaces. e.g. `list` can be replaced by `1 2 3 4 5 6` or by `Bob Mary Sue Greg`. `list` can also be a variable:
107
108 --
109
110     list[0]=Sam
111     list[1]=Lynne
112     list[2]=Dhavide
113     list[3]=Trevor
114     .
115     .
116     .
117     list[n]=Mark
118     
119 _Note:_ Bash is zero indexed, so counting always starts at `0`, not `1`.
120     
121
122 ### b) While Loop
123     
124 * **`while`** -->
125     `count=0   
126      while ${count} -lte 6
127      do
128        COMMAND HERE
129      done`
130
131 ### b) That the loop variable takes on a different value each time through the loop...
132 ### c) The difference between a variable's name and its value...
133 ### d) Why spaces and some punctuation characters shouldn't be used in files' names...
134 ### e) How to display history and re-use commands...
135 * **`history`** --> displays your command history to the standard output (usually the screen)
136
137
138
139 ## 6. Shell Scripts
140 ### a) How to store shell commands in a file...
141 ### b) How to run a shell script...
142 ### c) How to pass filenames into a shell script...
143
144
145
146 ## 7. Finding Things
147 ### a) How to select lines matching patterns in text files...
148 * **`grep [options] day haiku.txt`** --> finds every instance of the string `day` in the file haiku.txt and pipes it to standard output. 
149         * **`-E`** --> tells grep you will be using a regular expression. Enclose the regular expression in quotes. _Note:_ the power of `grep` comes from using regular expressions. Please see the regular expressions sheet for examples
150         * **`-i`** --> makes matching case-insensitive
151         * **`-n`** --> limits the number of lines that match to the first n matches
152         * **`-v`** --> shows lines that do not match the pattern (inverts the match)                    
153         * **`-w`** --> outputs instances where the pattern is a whole word
154
155 ### b) How to find files with certain properties...
156 * **`find . -type d` -->
157         * **`-type [df]`** --> d lists directories; f lists files
158         * **`-maxdepth n`** --> `find` automatically searches subdirectories. If you don't want that, specify the number of levels below the working directory you would like to search
159         * **`-mindepth n`** --> starts `find`'s search n levels below the working directory
160         
161 ### c) How to use one command's output as arguments to another command...
162
163 ### d) How are text and binary files different?...
164