IEEE Bash Scripting


           

Compiled vs Interpreted Example

program.c

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ 

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$

Compiled vs Interpreted Example

program.c

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ gcc program.c -o program

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$

Compiled vs Interpreted Example

program.c program

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ gcc program.c -o program
$ 

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$ 

Compiled vs Interpreted Example

program.c program

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ gcc program.c -o program
$ ./program

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$ 

Compiled vs Interpreted Example

program.c program

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ gcc program.c -o program
$ ./program
The answer to life, the universe, and everything is 42
$

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$ 

Compiled vs Interpreted Example

program.c program

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ gcc program.c -o program
$ ./program
The answer to life, the universe, and everything is 42
$

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$ python program.py

Compiled vs Interpreted Example

program.c program

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ gcc program.c -o program
$ ./program
The answer to life, the universe, and everything is 42
$

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$ python program.py
                

Compiled vs Interpreted Example

program.c program

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ gcc program.c -o program
$ ./program
The answer to life, the universe, and everything is 42
$

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$ python program.py
The answer to life, the universe, and everything: 42
                

Compiled vs Interpreted Example

program.c program

#include <stdio.h>
int main() {
  int a = 36;
  int b = 6;
  printf("The answer to life, the universe,\
  and everything: %d\n", a+b);
  return 0;
}
                
$ gcc program.c -o program
$ ./program
The answer to life, the universe, and everything is 42
$

program.py

a = 36;
b = 6;
print("The answer to life, the universe,\
 and everything: {}".format(a+b))
                
$ python program.py
The answer to life, the universe, and everything: 42
$

Python Shell

$ python

Python Shell

$ python
>>>
          

Python Shell

$ python
>>> a = 36
          

Python Shell

$ python
>>> a = 36
>>>
          

Python Shell

$ python
>>> a = 36
>>> b = 6
          

Python Shell

$ python
>>> a = 36
>>> b = 6
>>>
          

Python Shell

$ python
>>> a = 36
>>> b = 6
>>> print("The answer to life, the universe, and everything: {}".format(a+b))
          

Python Shell

$ python
>>> a = 36
>>> b = 6
>>> print("The answer to life, the universe, and everything: {}".format(a+b))
The answer to life, the universe, and everything: 42
>>>
          

Python Shell

$ python
>>> a = 36
>>> b = 6
>>> print("The answer to life, the universe, and everything: {}".format(a+b))
The answer to life, the universe, and everything: 42
>>> a+b
          

Python Shell

$ python
>>> a = 36
>>> b = 6
>>> print("The answer to life, the universe, and everything: {}".format(a+b))
The answer to life, the universe, and everything: 42
>>> a+b
42
>>>
          

Shells

MacOS
  • zsh
  • bash

Shells

Windows
  • Command Prompt
  • Windows PowerShell

Shells

Linux
  • bash
  • dash
  • zsh
  • ksh

Unix systems can do

cat /etc/shells

POSIX IEEE 1003.1 (2017)

Most POSIX Compliant Shell

Yash

Control Logic

If Statement:

if COMMAND; then
  # Insert more commands here
fi

Control Logic

If Statement:

if COMMAND; then
  # Insert more commands here
fi

if COMMAND; then
  # Insert more commands here
else
  # Do otherwise
fi

Control Logic

If Statement:

if COMMAND; then
  # Insert more commands here
fi

if COMMAND; then
  # Insert more commands here
else
  # Do otherwise
fi

if [[ 2 -eq 2 ]]; then
  # Insert more commands here
else
  # Do otherwise
fi

Control Logic

And and Or:

if [[ "$STRING1" == "$STRING2" && "$STRING1" == "$STRING3" ]]; then
  printf "%s is equal to both strings" "$STRING1"
fi

Control Logic

And and Or:

if [[ "$STRING1" == "$STRING2" || "$STRING1" == "$STRING3" ]]; then
  printf "%s is equal to either string" "$STRING1"
fi

Writing a Bash Script

$ notepad++ script.sh
#!/bin/bash

Writing a Bash Script

$ notepad++ script.sh
#!/usr/bin/env bash

Writing a Bash Script

$ notepad++ script.sh
#!/usr/bin/env bash
# Comment1: Today is a good day

echo "Hi there"
VAR1="21"
...

Writing a Bash Script

$ notepad++ script.sh
$ bash script.sh
Hi there
...
$
#!/usr/bin/env bash
# Comment1: Today is a good day

echo "Hi there"
VAR1="21"
...

Writing a Bash Script

$ notepad++ script.sh
$ chmod +x script.sh
$ ./script.sh
Hi there
...
$
#!/usr/bin/env bash
# Comment1: Today is a good day

echo "Hi there"
VAR1="21"
...

Scripts

#!/bin/bash --


control='ok'

adddir() {
  [[ -d $1 ]] || mkdir $1;
}

add_class() {

  # make the directories for seperate classes
  adddir Material/$1 && ln -sL ../../Material/$1 Classes/$1/Material
  adddir Homework/$1 && ln -sL ../../Homework/$1 Classes/$1/Homework
  adddir Textbooks/$1 && ln -sL ../../Textbooks/$1 Classes/$1/Textbooks


  if [[ -f Material/$1/syllabus.pdf ]] then
    # a little scuffed but looks for regex assuming only 1 will meet
    ln -sL ../../Material/*yllabus*.pdf Material/$1/syllabus.pdf
  fi
}

add_textbook() {
  book=$(basename $1)
  class=''

  # Check that Classes is not empty
  if [[ ! -d Classes/ ]] || [[ ! $(ls Classes/) ]]; then
    printf 'You are missing some Classes to setup\n'
    printf 'Please add that first\n'
    exit
  fi

  # choose class
  printf 'Choose a class: \n'
  printf '     %s\n' $(ls -d Classes/*/ | cut -d \/ -f2) #, funny this prints like a loop for every element of these
  printf ' : '
  read -r class
  if [[ ! -d Classes/$class ]]; then
    printf 'That is not a class!\n'
    printf 'Exiting...\n'
    exit 1;
  fi


  mv -i $1 $HOME/Documents/School/Textbooks/
  ln -s $HOME/Documents/School/Textbooks/${book} $(pwd -P)/Textbooks/$class/
}

usage() {
  printf '%s:

  Usage: %s [-c] [-h] [-t]

  Options:
    -c    Add a class
    -h    Show help (this message)
    -t    Add a textbook. Takes in a textbook, moves to ~/Documents/School/Textbooks
          and then creates a soft link in the classes Textbook directory.
          %s -t /path/to/textbook 

' $0 $0 $0
  exit 1
}


# check you are in the right place
if [[ $(basename $(dirname $(pwd))) != 'School' ]]; then
  printf 'You are not in the a Sem/Quarter directory!'
  usage
fi

while getopts ":hct:" arg; do
  case "${arg}" in
    c) 
      control=''
      ;;
    t) 
      # give a way to read the next argument
      if [[ -z ${OPTARG} ]]; then
        usage
      fi 
      add_textbook ${OPTARG}
      exit 0;
      ;;
    h) 
      usage
      ;;
    *)
      usage
      ;;
  esac
done

# Need to choose classes
if [[ ! -d Classes/ ]] || [[ $control != 'ok' ]]; then
  # add the directory if not existent
  adddir Classes

  # add classes with a prompt
  printf 'Set a class %s, bro: ' $(whoami)
  read -r control
  adddir Classes/$control

  while [[ $control != 'ok' ]]; do
    printf 'Add another class or say "ok" to finish [ok]: ' 
    # if read then overwrite control
    read -r control
    [[ $control != 'ok' ]] && adddir Classes/$control  
  done

else
  printf 'Classes/ already exists. Perhaps you meant to use [-c] flag.\n'
  usage
fi


# Add the dirs if they are not there yet
adddir Material
adddir Homework
adddir Textbooks

for i in $(ls -d Classes/*/ | cut -d \/ -f2); do

  # check if class hasn't been edited
  if [[ ! $(ls Classes/$i/) ]]; then
    printf 'Adding class %s\n' $i
    add_class $i
  fi

done

printf 'done'
https://devhints.io/bash

- functions, associative arrays, string substition, etc. - Look at a good cheatsheet

Simple Info

#!/bin/bash
KERNEL="$(uname -r)"
MEM="$(free -h | awk '/^Mem:/ {print $2}')"

echo "Hostname: " $HOSTNAME
echo "Username: " $USER
echo "Kernel Version: " $KERNEL
echo "Total Memory: " $MEM

Simple Number Comparison

#!/bin/bash
age=18
if [ "$age" -ge 18 ]; then
    echo "You are an adult."
else
    echo "You are a minor."
fi

Create a zip

#!/bin/bash
backup_dir="/path/to/backup"
source_dir="/path/to/source"
zip -r "$backup_dir/$backup_file" "$source_dir"

Simple Find and Replace

#!/usr/bin/env bash
# Demo 1

BADNAME="myVar"
GOODNAME="my_var"
for i in $(find . -type f); do
  if [[ "$i" != "./script.sh" ]]; then
    if grep "$BADNAME"  $i > /dev/null; then
      echo "Found in the phrase in ${i}";
      sed -i "s/$BADNAME/$GOODNAME/g" $i > /dev/null;
    fi
  fi
done
Http Server
$ ls 
Downloads/  Documents/  Videos/  ...
Http Server
$ cd Downloads/
Http Server
$ ls 
Bash-Workshop.jpg  Me-Playing-The-Saxophone.mp3  some-papers/
Http Server
$ ip a | grep inet
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host proto kernel_lo 
inet 100.80.134.178/20 brd 100.80.143.255 scope global dynamic noprefixroute wlp2s0
inet6 fe80::3977:6f8:fbce:e909/64 scope link noprefixroute
$ ifconfig a | grep inet
Http Server
$ python -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
127.0.0.1 - - [12/Mar/2024 10:28:39] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Mar/2024 10:28:41] "GET /Me-Playing-The-Saxophone.mp3 HTTP/1.1" 200 -
WGet

CSE Courses: cseweb.ucsd/classes

WGet

https://cseweb.ucsd.edu/classes/fa23/cse120-a/

WGet

https://cseweb.ucsd.edu/classes/fa23/cse120-a/lectures/mem.pdf

WGet
$ cd Downloads
$ ls
Bash-Workshop.jpg  Me-Playing-The-Saxophone.mp3  some-papers
$ 

          
WGet
$ cd Downloads
$ ls
Bash-Workshop.jpg  Me-Playing-The-Saxophone.mp3  some-papers
$ wget https://cseweb.ucsd.edu/classes/fa23/cse120-a/lectures/mem.pdf
WGet
$ cd Downloads
$ ls
Bash-Workshop.jpg  Me-Playing-The-Saxophone.mp3  some-papers
$ wget https://cseweb.ucsd.edu/classes/fa23/cse120-a/lectures/mem.pdf
--2024-03-12 11:27:28--  https://cseweb.ucsd.edu/classes/fa23/cse120-a/lectures/mem.pdf
Resolving cseweb.ucsd.edu (cseweb.ucsd.edu)... 132.239.8.30
Connecting to cseweb.ucsd.edu (cseweb.ucsd.edu)|132.239.8.30|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2497853 (2.4M) [application/pdf]
Saving to: ‘mem.pdf’

mem.pdf                                                   100%[=====================================================================================================================================>]   2.38M  6.58MB/s    in 0.4s    

2024-03-12 11:27:30 (6.58 MB/s) - ‘mem.pdf’ saved [2497853/2497853]
$ clear 
WGet
$ ls 
Bash-Workshop.jpg  Me-Playing-The-Saxophone.mp3  mem.pdf  some-papers
$ 
Get CSE Class Slides
#!/usr/bin/bash -x 
location="cseweb.ucsd.edu/classes/fa23/cse120-a/lectures/"

wget -r -np -R "index.html*" https://$location
class_list=$(ls -rt ./$location)


count=1
for i in $class_list; do

  mv -n ./$location/$i ./${count}_${i}
  count=$((count + 1))

done


rm -rf cseweb.ucsd.edu

wget and http server

wget and http server

$ mkdir temp/
$ cd temp
$ wget -k -r -p https://supercomputing-club.sdsc.edu/

wget and http server

$ python -m http.server

wget and http server

$ python -m http.server

Try visiting localhost:8000 if you completed these steps

Get every Canvas file from your course!

#!/usr/bin/env bash

COURSE_ID="123456"
API_TOKEN="12345~..."

mkdir -p files/

FILES=$(
	curl \
	-X GET \
	-H "Authorization: Bearer $API_TOKEN" \
		https://canvas.ucsd.edu/api/v1/courses/$COURSE_ID/files | \
		jq -r '.[] | "\(.filename),\(.url)"'
)

echo "$FILES" | while IFS= read -r line; do
	FILENAME=$(echo $line | awk -F',' '{print $1}')
	URL=$(echo $line | awk -F',' '{print $2}')
	echo "Downloading $FILENAME..."
	curl -s "$URL" -o "$FILENAME"
	mv "$FILENAME" "files/$FILENAME"
done

echo "Done! All your files are in the 'files/' directory."

Bash in Supercomputing

Most computers run some Unix derivative

Student Cluster Competition 2022 Tech Stack

SCC Applications Coming Soon!

Our Site

https://supercomputing-club.sdsc.edu/

Thank you

https://ieeeucsd.org/
https://supercomputing-club.sdsc.edu/
https://www.sdsc.edu/