======IPKA HINTS======
=====bc=====
The **bc**(**1**) tool is very useful for performing math on numbers. We've used it extensively on various projects throughout the semester.
====Usage Example 1====
Simplest usage, displaying a number:
$ echo "12" | bc -q
12
====Usage Example 2====
Using a variable:
$ value="12"
$ echo "${value}" | bc -q
12
====Usage Example 3====
Changing the base:
$ value="12"
$ echo "obase=2; ${value}" | bc -q
1100
====Usage Example 4====
Variable-izing the base:
$ base="2"
$ value="12"
$ echo "obase=${base}; ${value}" | bc -q
1100
=====file=====
The **file**(**1**) utility is useful for identifying file types, especially when the files themselves may not be properly named.
====example====
$ file /etc/motd
/etc/motd: ASCII text
=====grep=====
The **grep**(**1**) utility can be used to search through text files for patterns, of the literal or Regular Expression variety, by default outputting lines matching the search pattern. It is quite useful in command-line pipelines, to filter the output of a previous command's output.
====example 1====
Here, we use grep to filter the output of **file**, to display only the lines of output pertaining to Ruby scripts:
$ file /usr/local/bin/* | grep 'Ruby'
/usr/local/bin/autospec: Ruby script, ASCII text executable
/usr/local/bin/bundle: Ruby script, ASCII text executable
/usr/local/bin/bundler: Ruby script, ASCII text executable
/usr/local/bin/erubis: Ruby script, ASCII text executable
/usr/local/bin/httparty: Ruby script, ASCII text executable
/usr/local/bin/rackup: Ruby script, ASCII text executable
/usr/local/bin/rake: Ruby script, ASCII text executable
/usr/local/bin/rspec: Ruby script, ASCII text executable
/usr/local/bin/tilt: Ruby script, ASCII text executable
====example 2====
Counting the resulting output by line can result in a nice 'present' or 'not present' status (true, false):
$ file /usr/local/bin/wcp | grep 'Ruby' | wc -l
0
$ file /usr/local/bin/bundle | grep 'Ruby' | wc -l
1
This could provide a nice means of making a decision on whether or not to perform some processing on a given file.
=====ls=====
The **ls**(**1**) command can be used to list all files in a given directory. The **-1** (one) argument will force a listing of one entry per line. Providing a path to **ls** will cause it to list the files in that directory versus the default behavior of the current directory.
Providing an absolute path to commands when you run them disables any shell aliases that may be in place.
====For example====
/bin/ls -1 ${DATAPATH}
Will list all the files currently located in ${DATAPATH}, one entry per line.
=====Command Expansions=====
Command expansions are a form of UNIX quotes that allow you to capture the output of any enclosed commands, very useful for capturing into a variable or providing an in-line list of information to things that can utilize them.
====Example 1====
If you are in the Public Directory's ipka/files/ directory:
cat $(/bin/ls -1 ${DATAPATH})
Will concatenate to STDOUT the contents of all the files.
====Example 2====
And we can capture that expanded result (the listing of all the files) into a variable:
value=$(/bin/ls -1 ${DATAPATH})
=====list-based for loop=====
The numeric for loop is one variety of for loop. Bash also provides another, the "list-based" for loop (also known as a "for each" loop). While it can still be used to process numbers, it can also take in non-numeric data, processing each item of the list in turn.
====syntax====
The syntax is:
for value in LIST; do
# commands in loop
done
=====selection=====
The **[**(**1**) utility allows for the evaluation of a logical or relational condition, resulting in a true or false value. Combined with an '**if**' statement, this can be used to conditionally execute code based on the results of that evaluation.
if [ 17 -lt 43 ]; then
MESSAGE="LESS THAN"
else
MESSAGE="NOT LESS THAN"
fi
echo "${MESSAGE}"