Bash (Unix shell): Difference between revisions

No edit summary
 
(33 intermediate revisions by the same user not shown)
Line 12: Line 12:
echo $myvariable $anothervar
echo $myvariable $anothervar
</syntaxhighlight>
</syntaxhighlight>
You can check your bash scripts using [https://www.shellcheck.net/ https://www.shellcheck.net/].


==Usage==
==Usage==


===Basic If Statements===
[https://linuxize.com/post/bash-if-else-statement/ https://linuxize.com/post/bash-if-else-statement/]
<syntaxhighlight lang="bash">
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
</syntaxhighlight>
[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===
* <code>-eq</code> is <code>==</code>
* <code>-gt</code> is <code>></code>
* <code>-ge</code> is <code>>=</code>
===Arrays===
<syntaxhighlight lang="bash">
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
</syntaxhighlight>
;Notes
* <code>"${DRIVES[@]}"</code> means every element will be a new word
* <code>"${DRIVES[*]}"</code> will expand the array into a single word
===Functions===
<syntaxhighlight lang="bash">
#!/bin/bash
function say_hello {
    echo Hello $1
}
say_hello World
</syntaxhighlight>
===Redirects===
[https://www.gnu.org/software/bash/manual/html_node/Redirections.html Redirections]
<syntaxhighlight lang="bash">
# `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
</syntaxhighlight>
===Trap===
To make a bash script exit on ctrl c:
<syntaxhighlight lang="bash">
trap "exit" INT
</syntaxhighlight>
<syntaxhighlight lang="bash">
trap 'kill $(jobs -p)' EXIT
</syntaxhighlight>
===Wait===
Add <code>wait</code> at the end of a script to wait for all subprocesses.
===Brace Expansion===
When you type the following:
<syntaxhighlight lang="bash">
echo {red,green,blue}_apple
</syntaxhighlight>
bash will print out
<pre>
red_apple green_apple blue_apple
</pre>
If you want to save this into a variable, you can save it as an array:
<syntaxhighlight lang="bash">
APPLES=({red,green,blue}_apple)
echo "${APPLES[@]}"
</syntaxhighlight>
===<code>--</code>===
[https://unix.stackexchange.com/questions/11376/what-does-double-dash-mean Reference]
<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==
[https://stackoverflow.com/questions/59895/how-to-get-the-source-directory-of-a-bash-script-from-within-the-script-itself Stack overflow]
How to get the source directory of the bash script
<syntaxhighlight lang="bash">
#!/bin/bash
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
cd "${DIR}" || exit 1
</syntaxhighlight>
==Check if running as sudo==
[https://stackoverflow.com/questions/18215973/how-to-check-if-running-as-root-in-a-bash-script Reference]
<syntaxhighlight lang="bash">
if [ $EUID -ne 0 ]
  then echo "Please run as root"
  exit
fi
</syntaxhighlight>


==<code>.bashrc</code>==
==<code>.bashrc</code>==
Your <code>.bashrc</code> file will be loaded for each terminal.<br>
Your <code>.bashrc</code> file will be loaded for each terminal.<br>


==Presentation of Shell Variable==
===Presentation of Shell Variable (PS1)===
Add the following to show your  
Add the following to show your current working directory.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$'
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]]