Bash Script

Scripts are super useful to automate tasks.

Right now, I just write the command in the .zshrc, but in the future, when I have more complex commands, I would like to write my own scripts.

./install/setup.bash vs . install/setup.bash?

When you execute a script (.bash file) , what it is actually doing is creating a new shell, runs the script as a separate process, and copies back the output. If you want to update your current environment variables, ./install/setup.bash won’t work, since it will apply it in the new terminal created.

When you do . install/setup.bash, it executes the script in the current shell, meaning any changes it makes to the environment (such as changing environment variables) will persist in your current shell session.

Documentation

When you make a new file, you always have to add #!/bin/bash

#!/bin/bash 
echo "Hello World" 
echo $(which neqn) 
cat $(which neqn)

Also, you need to do chmod +x <name_of_file> so that it can be executed with ./name_of_file. The .sh extension is optional

We put quotations ("") around when we are just doing comparison of strings. Without the quotation, you would be loading values in.

#! /bin/bash
# ECHO COMMAND
echo Hello World!
 
# VARIABLES
# Uppercase by convention
# Letters, numbers, underscores
NAME="Bob"
echo "My name is $NAME"
echo "My name is ${NAME}" # This is a bit more readable
 
# USER INPUT
read -p "Enter your name: " NAME
echo "Hello $NAME, nice to meet you!"
 
# IF STATEMENTS
if [ "$NAME" == "Brad" ]
then
  echo "Your name is Brad"
elif [ "$NAME" == "Jack" ]
then  
  echo "Your name is Jack"
else 
  echo "Your name is NOT Brad or Jack"
fi
 
# COMPARISON
NUM1=31
NUM2=5
if [ "$NUM1" -gt "$NUM2" ]
then
  echo "$NUM1 is greater than $NUM2"
else
  echo "$NUM1 is less than $NUM2"
fi
 
######## COMPARISONS
# val1 -eq val2 Returns true if the values are equal
# val1 -ne val2 Returns true if the values are not equal
# val1 -gt val2 Returns true if val1 is greater than val2
# val1 -ge val2 Returns true if val1 is greater than or equal to val2
# val1 -lt val2 Returns true if val1 is less than val2
# val1 -le val2 Returns true if val1 is less than or equal to val2
########
 
# FILE CONDITIONS
FILE="test.txt"
if [ -e "$FILE" ]
then
  echo "$FILE exists"
else
  echo "$FILE does NOT exist"
fi
 
######## CONDITIONS
# -d file   True if the file is a directory
# -e file   True if the file exists (note that this is not particularly portable, thus -f is generally used)
# -f file   True if the provided string is a file
# -g file   True if the group id is set on a file
# -r file   True if the file is readable
# -s file   True if the file has a non-zero size
# -u    True if the user id is set on a file
# -w    True if the file is writable
# -x    True if the file is an executable
########
 
#CASE STATEMENT
read -p "Are you 21 or over? Y/N " ANSWER
case "$ANSWER" in 
  [yY] | [yY][eE][sS])
    echo "You can have a beer :)"
    ;;
  [nN] | [nN][oO])
    echo "Sorry, no drinking"
    ;;
  *)
    echo "Please enter y/yes or n/no"
    ;;
esac # notice how this is case backwards
 
# SIMPLE FOR LOOP
NAMES="Brad Kevin Alice Mark"
for NAME in $NAMES
  do
    echo "Hello $NAME"
done
 
# FOR LOOP TO RENAME FILES
FILES=$(ls *.txt)
NEW="new"
for FILE in $FILES  
  do
    echo "Renaming $FILE to new-$FILE"
    mv $FILE $NEW-$FILE
done
 
# WHILE LOOP - READ THROUGH A FILE LINE BY LINE
LINE=1
while read -r CURRENT_LINE # TODO: I am not sure about how this reads the file
  do
    echo "$LINE: $CURRENT_LINE"
    ((LINE++))
done < "./new-1.txt"
 
# FUNCTION
function sayHello() {
  echo "Hello World"
}
sayHello
 
# FUNCTION WITH PARAMS
function greet() { # You don't pass in arguments into the function directly, see below
  echo "Hello, I am $1 and I am $2"
}
greet "Brad" "36"
 
# CREATE FOLDER AND WRITE TO A FILE
mkdir hello
touch "hello/world.txt"
echo "Hello World" >> "hello/world.txt"
echo "Created hello/world.txt"