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"