# Lesson 3.1

## Guided Exercises

1. According to the extensions, which of the following tools were used to create these files?
	* archive.tar
	* archive.tgz
	* archive.tar.xz
1. According to the extensions, which of these files are archives and which are compressed?
	* file.tar
	* file.tar.bz2
	* file.zip
	* file.xz
1. How would you add a file to a gzip compressed tar file?
1. Which tar option instructs tar to include the leading / in absolute paths?
1. Does zip support different compression levels?

## Explorational Exercises

1. When extracting files, does tar support globs in the file list?
1. How can you make sure a decompressed file is identical to the file before it was compressed?
1. What happens if you try to extract a file from a tar archive that already exists on your filesystem?
1. How would you extract the file archive.tgz without using the tar z option?

# Lesson 3.2.1

## Guided Exercises

1. List the contents of your current directory, including the ownership and permissions, and redirect the output to a file called contents.txt within your home directory.
1. Sort the contents of the contents.txt file from your current directory and append it to the end of a new file named contents-sorted.txt.
1. Display the last 10 lines of the /etc/passwd file and redirect it to a new file in your user’s Documents directory.
1. Count the number of words within the contents.txt file and append the output to the end of a file field2.txt in your home directory. You will need to use both input and output redirection.
1. Display the first 5 lines of the /etc/passwd file and sort the output reverse alphabetically.
1. Using the previously created contents.txt file, count the number of characters of the last 9 lines.
1. Count the number of files called test within the /usr/share directory and its subdirectories. Note: each line output from the find command represents a file.

## Explorational Exercises

1. Select the second field of the contents.txt file and redirect the standard output and error output to another file called field1.txt.
1. Using the input redirection operator and the tr command, delete the dashes (-) from the contents.txt file.
1. What is the biggest advantage of only redirecting errors to a file?
1. Replace all recurrent spaces within the alphabetically sorted contents.txt file with a single space.
1. In one command line, eliminate the recurrent spaces (as done in the previous exercise), select the ninth field and sort it reverse alphabetically and non-case sensitive. How many pipes did you have to use?

# Lesson 3.2.1

## Guided Exercises

1. Using grep and the /usr/share/hunspell/en_US.dic file, find the lines that match the following criteria:
	* All lines containing the word cat anywhere on the line.
	* All lines that do not contain any of the following characters: sawgtfixk.
	* All lines that start with any 3 letters and the word dig.
	* All lines that end with at least one e.
	* All lines that contain one of the following words: org , kay or tuna.
	* Number of lines that start with one or no c followed by the string ati.

## Explorational Exercises

1. Find the regular expression that matches the words in the “Include” line and doesn’t match the ones in the “Exclude” line:
	* Include: pot, spot, apot
	* Exclude: potic, spots, potatoe
	* Include: arp99, apple, zipper
	* Exclude: zoo, arive, attack
	* Include: arcane, capper, zoology
	* Exclude: air, coper, zoloc
	* Include: 0th/pt, 3th/tc, 9th/pt
	* Exclude: 0/nm, 3/nm, 9/nm
	* Include: Hawaii, Dario, Ramiro
	* Exclude: hawaii, Ian, Alice
1. What other useful command is commonly used to search within the files? What additional functionalities does it have?
1. Thinking back at the previous lesson, use one of the examples and try to look for a specific pattern within the output of the command, with the help of grep.

# Lesson 3.3.1

1. The user types the following to their shell:
	```
	$ PATH=~/scripts
	$ ls
	Command 'ls' is available in '/bin/ls'
	The command could not be located because '/bin' is not included in the PATH environment variable.
	ls: command not found
	```
	* What has the user done?
	* What command will combine the current value of PATH with the new directory ~/scripts?
1. Consider the following script. Notice that it is using elif to check for a second condition:
	```
	>  /!bin/bash
	
	> fruit1 = Apples
	> fruit2 = Oranges
	
	  if [ $1 -lt $# ]
	  then
	    echo "This is like comparing $fruit1 and $fruit2!"
	> elif [$1 -gt $2 ]
	  then
	>   echo '$fruit1 win!'
	  else
	>   echo "Fruit2 win!"
	> done
	```
	* The lines marked with a > contain errors. Fix the errors.
1. What will the output be in the following situations?
	```
	$ ./guided1.sh 3 0
	$ ./guided1.sh 2 4
	$ ./guided1.sh 0 1
	```

## Explorational Exercises

1. Write a simple script that will check if exactly two arguments are passed. If so, print the arguments in reverse order. Consider this example (note: your code may look different than this, but should lead to the same output):
	```
	if [ $1 == $number ]
	then
	  echo "True!"
	fi
	```
1. This code is correct, but it is not a number comparison. Use an internet search to discover how this code is different from using -eq.
1. There is an environment variable that will print the current directory. Use env to discover the name of this variable.
1. Using what you have learned in questions 2 and 3, write a short script that accepts an argument. If an argument is passed, check if that argument matches the name of the current directory. If so, print yes. Otherwise, print no.

# Lesson 3.3.2

## Guided Exercises

1. Read the contents of script1.sh below:
	```
	#!/bin/bash
	
	if [ $# -lt 1 ]
	then
	  echo "This script requires at least 1 argument."
	  exit 1
	fi
	
	echo $1 | grep "^[A-Z]*$" > /dev/null
	if [ $? -ne 0 ]
	then
	  echo "no cake for you!"
	  exit 2
	fi
	
	echo "here's your cake!"
	exit 0
	```
	* What is the output of these commands?
	```
	./script1.sh
	echo $?
	./script1.sh cake
	echo $?
	./script1.sh CAKE
	echo $?
	```

2. Read the contents of file script2.sh:
	```
	for filename in $1/*.txt
	do
	   cp $filename $filename.bak
	done
	```
	* Describe the purpose of this script as you understand it.

## Explorational Exercises

1. Create a script that will take any number of arguments from the user, and print only those arguments which are numbers greater than 10.
