Bash (Unix shell): Difference between revisions

From David's Wiki
 
(12 intermediate revisions by the same user not shown)
Line 20: Line 20:
[https://linuxize.com/post/bash-if-else-statement/ https://linuxize.com/post/bash-if-else-statement/]
[https://linuxize.com/post/bash-if-else-statement/ https://linuxize.com/post/bash-if-else-statement/]
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
if [[ $VAR -gt 10 ]] then
if [[ $VAR -gt 10 ]]; then
   echo "The variable is greater than 10."
   echo "The variable is greater than 10."
elif [[ $VAR -eq 10 ]] then
elif [[ $VAR -eq 10 ]]; then
   echo "The variable is equal to 10."
   echo "The variable is equal to 10."
else
else
Line 30: Line 30:


[https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html bash if statements]
[https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html bash if statements]
;Some common expressions:
<syntaxhighlight lang="bash">
# File exists and is a regular file.
[ -f $FILE ]
# File is non-zero size
[ -s $FILE ]
# String has length zero
[ -z $STR ]
# String has length non-zero
[ -n $STR ]
</syntaxhighlight>
<syntaxhighlight lang="bash">
# Check if user is root (https://stackoverflow.com/questions/18215973/how-to-check-if-running-as-root-in-a-bash-script)
if [ "$EUID" -ne 0 ]; then
  echo "Please run as root"
  exit
fi
</syntaxhighlight>


===Comparisons===
===Comparisons===
Line 35: Line 54:
* <code>-gt</code> is <code>></code>
* <code>-gt</code> is <code>></code>
* <code>-ge</code> is <code>>=</code>
* <code>-ge</code> is <code>>=</code>
===Check if File/Folder Exists===
See [https://linuxize.com/post/bash-check-if-file-exists/#check-if-directory-exist https://linuxize.com/post/bash-check-if-file-exists/#check-if-directory-exist].


===Arrays===
===Arrays===
Line 50: Line 66:
   /media/veracrypt7
   /media/veracrypt7
   /media/veracrypt8
   /media/veracrypt8
  /media/veracrypt9
)
)
# Add to the array
DRIVES+=(/media/veracrypt9)


for i in "${DRIVES[@]}"
for i in "${DRIVES[@]}"
Line 96: Line 113:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
trap "exit" INT
trap "exit" INT
</syntaxhighlight>
<syntaxhighlight lang="bash">
trap 'kill $(jobs -p)' EXIT
</syntaxhighlight>
</syntaxhighlight>


Line 121: Line 141:


<code>--</code> explicitly ends non-positional arguments for many commands
<code>--</code> explicitly ends non-positional arguments for many commands
===alias===
You can add aliases to your <code>.bashrc</code> to make commmon commands shorter.
<syntaxhighlight lang="bash">
alias kc=kubectl
alias tb="tensorboard --logdir"
</syntaxhighlight>


==dirname==
==dirname==
Line 129: Line 157:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash
 
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
DIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
cd "${DIR}" || exit 1
</syntaxhighlight>
</syntaxhighlight>


Line 150: Line 178:
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '
</syntaxhighlight>
</syntaxhighlight>
[[Category:Programming languages]]

Latest revision as of 00:44, 26 December 2023

Bash Scripting


Getting Started

Here is an example bash script

#!/bin/bash
# A simple variable example
myvariable=Hello
anothervar=Fred

echo $myvariable $anothervar

You can check your bash scripts using https://www.shellcheck.net/.

Usage

Basic If Statements

https://linuxize.com/post/bash-if-else-statement/

if [[ $VAR -gt 10 ]]; then
  echo "The variable is greater than 10."
elif [[ $VAR -eq 10 ]]; then
  echo "The variable is equal to 10."
else
  echo "The variable is less than 10."
fi

bash if statements

Some common expressions
# File exists and is a regular file.
[ -f $FILE ]
# File is non-zero size
[ -s $FILE ]
# String has length zero
[ -z $STR ]
# String has length non-zero
[ -n $STR ]
# Check if user is root (https://stackoverflow.com/questions/18215973/how-to-check-if-running-as-root-in-a-bash-script)
if [ "$EUID" -ne 0 ]; then
  echo "Please run as root"
  exit
fi

Comparisons

  • -eq is ==
  • -gt is >
  • -ge is >=

Arrays

DRIVES=(
  /media/veracrypt1
  /media/veracrypt2
  /media/veracrypt3
  /media/veracrypt4
  /media/veracrypt5
  /media/veracrypt6
  /media/veracrypt7
  /media/veracrypt8
)
# Add to the array
DRIVES+=(/media/veracrypt9)

for i in "${DRIVES[@]}"
do
        ls $i
done
Notes
  • "${DRIVES[@]}" means every element will be a new word
  • "${DRIVES[*]}" will expand the array into a single word

Functions

#!/bin/bash 
function say_hello {
    echo Hello $1
}
say_hello World

Redirects

Redirections

# `ls` is an example command

# Input to stdin
ls < word

# Output stdout to file
ls > file.txt

# Append stdout to file
ls >> file.txt

# Output stderr and stdout to file
ls > file.txt 2>&1
ls &> file.txt # Only works in bash, not sh

Trap

To make a bash script exit on ctrl c:

trap "exit" INT
trap 'kill $(jobs -p)' EXIT

Wait

Add wait at the end of a script to wait for all subprocesses.

Brace Expansion

When you type the following:

echo {red,green,blue}_apple

bash will print out

red_apple green_apple blue_apple

If you want to save this into a variable, you can save it as an array:

APPLES=({red,green,blue}_apple)
echo "${APPLES[@]}"

--

Reference

-- explicitly ends non-positional arguments for many commands


alias

You can add aliases to your .bashrc to make commmon commands shorter.

alias kc=kubectl
alias tb="tensorboard --logdir"

dirname

Stack overflow

How to get the source directory of the bash script

#!/bin/bash
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
cd "${DIR}" || exit 1

Check if running as sudo

Reference

if [ $EUID -ne 0 ]
  then echo "Please run as root"
  exit
fi

.bashrc

Your .bashrc file will be loaded for each terminal.

Presentation of Shell Variable (PS1)

Add the following to show your current working directory.

PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '