Update shell_cheatsheet.md
[swc-modular-shell-hearing.git] / shell_cheatsheet.md
1 # Basic Shell Commands
2 ***
3
4 ## 1. Shell Basics:
5
6 | Symbol         | 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
20 `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
21 `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)
22
23 ### b) How to delete files and directories...
24 #### _Remember that deleting is forever. There is NO going back_
25 * **`rm ./filename`** --> deletes a file called `filename` from the current directory 
26 * **`rmdir ./dirname`** --> deletes the directory `dirname` from the current directory. _Note:_ `dirname` must be empty for `rmdir` to run.
27
28 ### c) How to copy and rename files and directories...
29 * **`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`
30 * **`cp tmp/filename .`** --> copies the file `filename` from the directory `tmp` to the current directory. _Note:_ _(i)_ the original file is still there
31
32
33
34 ## 3. Pipes and Filters
35 ### a) How to use wildcards to match filenames...
36 Wildcards are a shell feature that makes the command line much more powerful than any GUI file managers. 
37
38
39 ** Table of commonly used wildcards **
40
41 | Wildcard               | Matches                                        |  
42 |------------------------|------------------------------------------------|  
43 | `*`                    | zero or more characters                        |  
44 | `?`                    | exactly one character                          |  
45 | `[abcde]`              | exactly one of the characters listed           |  
46 | `[a-e]`                | exactly one character in the given range       |  
47 | `[!abcde]`             | any character not listed                       |  
48 | `[!a-e]`               | any character that is not in the given range   |  
49 | `{software,carpentry}` | exactly one entire word from the options given |  
50
51
52
53 ### b) That wildcards are expanded by the shell before commands are run...
54 ### c) How to redirect a command's output to a file...
55 ### d) How to redirect a command's input from a file...
56 ### e) How to use the output of one command as the input to another with a pipe...
57 ### f) That combining single-purpose filters with pipes is the most productive way to use the shell...
58 ### g) That if a program conforms to Unix conventions, it can easily be combined with others...
59
60
61
62 ## 4. Variables
63 ### a) Assignment
64 * **`varname=1`** -->
65
66 ### b) Indexing 
67 * **`varname[0]`** --> _Note:_ the shell is zero indexed.  That means you always start counting from zero
68
69 ### c) Referencing
70 * **`${varname}` -->
71 * **`${varname[@]` --> 
72
73  
74
75 ## 5. Loops
76 NEED TO DO VARIABLE ASSIGNMENT FIRST!!!!
77 ### a) How to repeat operations using a loop...
78 * **`for`** -->  
79     `for filename in *.dat
80     do
81       mv ${filename} ${newname}
82     done`
83     
84 * **`while`** -->
85     `count=0   
86      while ${count} -lte 6
87      do
88        COMMAND HERE
89      done`
90
91 ### b) That the loop variable takes on a different value each time through the loop...
92 ### c) The difference between a variable's name and its value...
93 ### d) Why spaces and some punctuation characters shouldn't be used in files' names...
94 ### e) How to display history and re-use commands...
95 * **`history`** --> displays your command history to the standard output (usually the screen)
96
97
98
99 ## 6. Shell Scripts
100 ### a) How to store shell commands in a file...
101 ### b) How to run a shell script...
102 ### c) How to pass filenames into a shell script...
103
104
105
106 ## 7. Finding Things
107 ### a) How to select lines matching patterns in text files...
108 * **`grep [options] day haiku.txt`** --> finds every instance of the string `day` in the file haiku.txt and pipes it to standard output. 
109         * **`-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
110         * **`-i`** --> makes matching case-insensitive
111         * **`-n`** --> limits the number of lines that match to the first n matches
112         * **`-v`** --> shows lines that do not match the pattern (inverts the match)                    
113         * **`-w`** --> outputs instances where the pattern is a whole word
114
115 ### b) How to find files with certain properties...
116 * **`find . -type d` -->
117         * **`-type [df]`** --> d lists directories; f lists files
118         * **`-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
119         * **`-mindepth n`** --> starts `find`'s search n levels below the working directory
120         
121 ### c) How to use one command's output as arguments to another command...
122
123 ### d) How are text and binary files different?...
124