Skip to content
Snippets Groups Projects
Commit 070d4437 authored by Aline Abler's avatar Aline Abler
Browse files

Last year's stuff

parent b22957e1
No related branches found
No related tags found
No related merge requests found
File added
File added
---
author:
- Aline Abler
title: Bash Workshop
---
# Overview
## Table of Contents
### What will we do today?
* Theory
* What is bash?
* The basics
* Exercises
# What is bash?
## Shells
### Bash is a not a programming language.
* It is a *shell*
* It is an interface between you and your computer
* It allows you to access the operating system’s services (i.e.
run programs)
* *It is not designed as a programming language*, but can be used
as such
### Bash is not the only shell there is.
* sh, ksh, zsh, fish, dash...
* Most commands work in any shell, but *some don’t*
* Usually this doesn’t matter too much
### Bash scripts are not programming
* Glue existing programs together to create new ones
* It’s possible to write entire programs, but please don’t
# The basics
## How to bash
### Look, a bash script
# !/bin/bash
echo 'Hello World'
echo Bash is awesome
# Now some fun stuff:
sudo zypper update
notify-send 'Update complete'
feh --bg-fill 'pictures/fancy_wallpaper.jpg'
youtube-dl -o 'Video.%(ext)s' 'https://www.youtube.com/watch?v=lAIGb1lfpBw'
### What bash can do
* Automate anything you can do from a console
* Let several separate programs work together
## Strings
### All about strings
\bigtext{Everything is a string}
### Strings and word splitting
* A string is a sequence of characters that is *treated as a unit*
* Commands are strings, too
* Strings are split at every space, tab, or newline *unless they're in quotes*
### Meaning of strings
echo Hello World
* `echo`, `Hello` and `World` are single strings
* The first string becomes the command, all following become
*arguments*
<!-- -->
echo 'Hello World'
* Here, `Hello World` is just one string
### Repeat after me
\bigtext{Every word is a single argument unless you use quotes.}
## Commands
### All about commands
\bigtext{Everything that does something is a command}
### Why is this so important?
* *if* and *while* are commands
* *\[\[* is a command
### Example
* wrong:
[[1==3]]
* Bash's answer:
bash: [[1==3]]: command not found
* correct:
[[ 1 == 3 ]]
### Repeat after me
\bigtext{If there's brackets, you probably need spaces.}
## All about return values
### All about return values
\bigtext{Every command returns a value}
### Return values
* Every command returns a number, its *return value*
* 0 means success\
Everything else means there was an error
* Some commands also print to *stdout* - that's what you see.
### Return values
* What you run
echo 'Hello World'
* What you see
Hello World
* What bash sees
0
### Why is that important?
* *&&*, *||*, *if* and *while* all act based on the return value of something
* They *disregard that command’s actual output*
### Example
if ls -l foo
then
echo 'File foo exists'
else
echo 'File foo does not exist'
fi
## Expansion
### Bash doesn’t only run commands
* *Tilde expansion*\
`~/files` becomes `/home/alinea/files`
* *Variable expansion*\
`$BROWSER` becomes `Firefox`
* *Arithmetic expansion*\
`$(( 1 + 4 ))` becomes `5`
* *Command substitution*\
`$( pwd )` becomes `/home/alinea/scripts`
* *Pathname expansion* (or *globbing*)\
`files/qui*` becomes `files/quicknotes files/quiz`
### Bash doesn’t only run commands
* Expansion happens before any command is run
* Double quotes (") don't prevent expansion, but single quotes (') do.
$ echo "$HOME" '$HOME'
/home/alinea $HOME
* Expansion happens *before word splitting*
### The issue with word splitting
var='Unimportant File.odt'
rm $var # Variable expansion
becomes
rm Unimportant File.odt
### The issue with word splitting
* The correct way
rm "$var"
### Repeat after me:
\bigtext{If there's a dollar, you probably need quotes!}
# What bash is used for
## The whole point of bash
### Why is bash awesome?
* Bash can easily invoke any programs and connect them
* *Bash is like glue*
## How to write a bash script
### How to write a bash script
* I want a script that searches youtube and downloads the first video it finds
### Splitting it up
* Search youtube
* Download video
### Google for a program that already does what you need
* `youtube-dl` can download a video from youtube
<!-- -->
youtube-dl -o 'Video.%(ext)s' 'https://www.youtube.com/watch?v=lAIGb1lfpBw'
### Splitting it up even further
* Search youtube
* Download youtube results website
* Search website text
* Find first youtube video link
* Download video
# Your time to shine!
## What happens now?
### Hands on!
#### Self-driven exercises
* Self study using a guide
* Try some of our exercises
* Choose the exercises you find interesting! No need to go in order.
#### Guided exercises
* Solve easy exercises in plenum
* Tailored to complete beginners
* Please sit in the front
### Course material
* These slides, exercise sheet and bash guide: \
\soft{http://thealternative.ch/index.php?view=knowhow}
* Please leave some feedback! \
\soft{http://feedback.thealternative.ch}
<!-- -->
* \soft{Theme by} Christian Horea, [CC BY](https://creativecommons.org/licenses/by/4.0/)
File added
#!/bin/bash
echo Hello World
echo Bash is awesome
# Now some fun stuff:
sudo zypper update
notify-send "Update complete"
feh --bg-fill "pictures/fancy_wallpaper.jpg"
youtube-dl -o "Video.%(ext)s" "https://www.youtube.com/watch?v=lAIGb1lfpBw"
\documentclass[aspectratio=169,12pt]{beamer}
\usepackage{lmodern}
\usepackage[T1]{fontenc} %pipes don't display properly without this
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{color}
\usepackage{datapie}
\usepackage{multicol}
\usepackage{siunitx} %pretty measurement unit rendering
\usepackage{hyperref} %enable hyperlink for urls
\usepackage{caption} % needed to tweak caption size
\newcommand{\passthrough}[1]{#1}
\usefonttheme[onlymath]{serif}
\setcounter{MaxMatrixCols}{20}
\DeclareSIUnit\pixel{px}
\usecolortheme[RGB={37,68,113}]{structure}
\usetheme{Dresden}
\newenvironment{figurehere}
{\def\@captype{figure}}
{}
\makeatother
%commands to exclude sections from miniframes
\makeatletter
\let\beamer@writeslidentry@miniframeson=\beamer@writeslidentry
\def\beamer@writeslidentry@miniframesoff{%
\expandafter\beamer@ifempty\expandafter{\beamer@framestartpage}{}% does not happen normally
{%else
% removed \addtocontents commands
\clearpage\beamer@notesactions%
}
}
\newcommand*{\miniframeson}{\let\beamer@writeslidentry=\beamer@writeslidentry@miniframeson}
\newcommand*{\miniframesoff}{\let\beamer@writeslidentry=\beamer@writeslidentry@miniframesoff}
\beamer@compresstrue
\makeatother
\providecommand{\tightlist}{%
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
%various gray colors
\definecolor{slg}{gray}{0.25}
\definecolor{lg}{gray}{0.55}
\definecolor{vlg}{gray}{0.73}
\definecolor{tlg}{gray}{0.9}
%TheAlt colors
\definecolor{ldorange}{HTML}{F18A20}
\colorlet{ldbright}{ldorange!70!white} % tinted version of orange, used in miniframes
\definecolor{ldblue}{HTML}{254471}
%%Theme colors
%\definecolor{thgreen}{HTML}{A1A92C}
%\definecolor{thmauve}{HTML}{97284D}
%Theme colors
\definecolor{thgreen}{HTML}{539727}
\definecolor{thmauve}{HTML}{572272}
%reduce caption font size:
\captionsetup{font={scriptsize,color=lg}}
%do not prepend numbering/lettering to figures/subfigures
\captionsetup{labelformat=empty} %do not prepend letters to figure captions
%Apply TheAlt colors to theme
% section titles in top navigation bar
\setbeamercolor{section in head/foot}{parent=palette tertiary,fg=ldorange}
\setbeamertemplate{section in head/foot shaded}{\color{ldbright}\usebeamertemplate{section in head/foot}}
% miniframes (little navigation circles)
\setbeamercolor*{mini frame}{fg=ldorange,bg=ldbright}
\setbeamertemplate{mini frame in other section}[default][0]
\setbeamertemplate{mini frame in other subsection}[default][0]
% others
\setbeamercolor{author in head/foot}{fg=white}
\setbeamercolor{subsection in head/foot}{fg=white}
\setbeamercolor{caption name}{fg=vlg}
\setbeamercolor{caption}{fg=vlg}
\setbeamercolor{frametitle}{fg=ldblue}
\setbeamertemplate{caption}{\raggedright\insertcaption\par}
\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{bibliography item}[text]
\definecolor{mygreen}{rgb}{0,0.6,0}
\definecolor{mygray}{rgb}{0.5,0.5,0.5}
\definecolor{mymauve}{rgb}{0.58,0,0.82}
\lstdefinestyle{custombash}{
belowcaptionskip=1\baselineskip,
captionpos=,
breaklines=true,
frame=L,
xleftmargin=\parindent,
language=bash,
morestring=[b]',
morekeywords=[2]{sudo,zypper,notify-send,feh,youtube-dl,sort,tee,head,tail,shuf,mpv,find,convert,xrandr,curl,wget,grep,xdotool,rm,cp,mv,touch,bash,chmod,mkdir,rsync,mplayer,mpv,xdotool,jshon},
showstringspaces=false,
basicstyle=\scriptsize\ttfamily,
rulecolor=\color{tlg},
backgroundcolor=\color{tlg},
fillcolor=\color{tlg},
rulesepcolor=\color{tlg},
commentstyle=\itshape\color{thmauve!60!black},
keywordstyle=\bfseries\color{thgreen},
identifierstyle=\color{ldblue},
stringstyle=\color{thmauve}
}
\lstset{
style=custombash,
caption={Descriptive Caption Text},
label=DescriptiveLabel
}
$if(title)$
\title{$title$}
$endif$
$if(subtitle)$
\subtitle{$subtitle$}
$endif$
$if(author)$
\author{$for(author)$$author$$sep$ \and $endfor$}
$endif$
\institute{\includegraphics[width=0.35\textwidth]{img/logo_blue.pdf}}
\date{$date$}
\renewcommand{\emph}[1]{\textcolor{ldorange}{#1}}
\let\oldtextbf\textbf
\renewcommand{\textbf}[1]{\textcolor{ldorange}{\oldtextbf{#1}}}
\newcommand{\soft}[1]{\textcolor{lg}{#1}}
\newcommand{\textt}[1]{\textcolor{blue}{\texttt{#1}}}
\newcommand{\bigtext}[1]{\centering\Huge \textbf{\textcolor{ldorange}{#1}}\normalsize}
%shortcut to insert small logo in footline
\def\logo{%
\resizebox{!}{3ex}{\includegraphics{img/logo_white.pdf}}
}
% Define a custom footline that includes our logo
\setbeamertemplate{footline}
{%
\begin{beamercolorbox}[wd=\paperwidth,ht=2.5ex,dp=1.125ex,%
leftskip=.3cm,rightskip=.3cm plus1fil]{title in head/foot}
\usebeamerfont{title in head/foot}%
\insertshorttitle\hfill\insertframenumber
\end{beamercolorbox}
\begin{beamercolorbox}[wd=\paperwidth,ht=3.5ex,dp=1.625ex,%
leftskip=.3cm,rightskip=.3cm plus1fil]{author in head/foot}
\usebeamerfont{author in head/foot}
\raisebox{0.5ex}{\insertshortauthor}\hfill\raisebox{-0.5ex}{\logo}
\end{beamercolorbox}
}
\begin{document}
$if(title)$
\frame{\titlepage}
$endif$
$for(include-before)$
$include-before$
$endfor$
$if(toc)$
\begin{frame}
\tableofcontents[hideallsubsections]
\end{frame}
$endif$
$body$
$for(include-after)$
$include-after$
$endfor$
\end{document}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment