Tutorial: A bit of Bash
--D. Thiebaut (talk) 11:03, 26 November 2013 (EST)
A quick review of some useful Bash commands that can be used on the command line, or that can be included in bash scripts
Contents
Exploration
A good reference on using a shell can be found here: http://linuxcommand.org/.
Here's a recommended path through this on-line tutorial; just click on each link, read the description, and try it out on the linux server (aurora.smith.edu very likely) that you are connected to.
- What Is "The Shell"?
- Navigation
- Looking Around
- (A Guided Tour --skip for later)
- Manipulating Files
- Working With Commands
- I/O Redirection (very important)
- Expansion (stop at arithmetic expansion)
- Permissions (very important)
- (Job Control --skip for later)
Challenge 1 |
- Create three files in your Linux account.
- The first one should be called file1.txt and reside in the path ~/labs/lab1/. Its permissions should be "rwx------". It should contain the text "Mary had a little lamb."
- The second one should be called hello.asm and reside in ~/hws/hw1/. Its permissions should be "rw-rw-rw-". It should contain the "hello world" program we saw in class.
- The third should be the executable version of hello.asm, and reside in the ~/ directory.
wc and grep
- Get a copy of James Joyce's Ulysses book by running this command:
wget https://www.gutenberg.org/files/4300/4300.txt
- Verify that you have a file called 4300.txt in your directory.
- Rename the file ulysses.txt, which is a more appropriate name.
- Let's view just the top 30 lines of the file:
head -30 ulysses.txt
- and the last 30 lines:
tail -30 ulysses.txt
- How about the 15th to the 20th line? Think about how you would do that...
head -20 ulysses.txt | tail -5
- Let's get some statistics on the text file:
wc ulysses.txt
- you will observe that the file contains over 30,000 lines, over 250,000 words, and over 1.5 million characters.
- If you had wanted just the number of lines, you could have typed
wc -l ulysses.txt
Challenge 2 |
- Use the man pages for wc and figure out how to make it tell you the length (in character) of the longest line in the file. (to get the man page for a command, use man wc at the prompt.
- Let's find all the lines in the book that contains the name of the main protagonist, Muliligan:"
grep Mulligan ulysses.txt
- Let's count the number of lines that contain "Mulligan":
grep Mulligan ulysses.txt | wc -l
- Let's count how many "Buck Mulligan" appear together:
grep "Buck Mulligan" ulysses.txt | wc -l
- Note that we use double-quotes to indicate that the string "Buck Mulligan" should be treated as a block.
Challenge 3 |
- How many lines contain "Buck" but not "Mulligan"?
- How many lines contain "Mulligan" but not "Buck"?
File System
Challenge 4 |
- Create 3 text files in your account.
- The first one should be called file1.txt and reside in the path ~/labs/lab1/. Its permissions should be "rwx------". It should contain the text "Mary had a little lamb."
- The second one should be called hello.asm and reside in ~/hws/hw1/. Its permissions should be "rw-rw-rw-". It should contain the "hello world" program we saw in class.
- The third should be the executable version of hello.asm, and reside in the ~/ directory.
Creating a bash script
- first line should contain name of bash shell
#! /bin/bash
- make the script executable
chmod +x scriptname
Variables
- Declaration
file="hello.txt" file=`ls -1 *.txt | head -1` # get the first .txt file in the directory
- In expressions: put a $ in front of it!
URL="http://cs.smith.edu/dftwiki/images/" file="toto.png" pathFile=$URL$file file="alpha" pathFile=$URL${file}.png # add braces if string needs to be concatenated to variable
Script Parameters
- assume doit.sh is a script and it is called as follows:
doit.sh 8 2000 50
- To get the arguments inside the script:
NP=$1 # will get 8 N=$2 # will get 2000 M=$3 # will get 50
- To test if the number of parameters is 3 inside the script:
if [ "$#" -ne 3 ]; then echo "syntax: doit.sh NP N M" exit fi
Displaying strings and various quantities
Getting the length of a string variable
name="toto.txt" echo "length of $name = ${#name}" #will output 8
Getting extension and name (without extension) of a file
fullPath="/usr/local/bin/toto.txt" fileName="${fullPath##*/}" echo "file name with extension = $fileName" extension="${fullPath##*.}" fileName="${fileName%.*}" echo "fullPath = $fullPath" echo "fileName without extension = $fileName" echo "extension = $extension"
For Loops
- loop from 1 to 10
for i in 1 2 3 4 5 6 7 8 9 10 ; do echo $i done
- or
for i in {1..10} ; do echo $i done
- or
for i in {1..10} ; do echo $i; done
- loop through strings
for file in toto.txt tata.txt tutu.txt titi.txt ; do echo $file done
- loop through all the files in a directory
dir="/enwiki/0/00" for file in $dir/* ; do echo "$file" done
- or
dir="/enwiki/0/00" for file in `ls -1 $dir` ; do echo $file done
Sort lists
Alphabetically
- to generate a sorted list of the files on the Desktop:
ls Desktop | sort
Numerically
- to sort a list of numbers.
for i in 10 1 3 5 6 2 4 7 9 ; do echo $i ; done | sort -n
- to remove replicated numbers
for i in 10 1 10 3 3 5 6 3 2 4 7 9 6 6 6 5 ; do echo $i ; done | sort -n | uniq