A Cheat Sheet for your Bash#
Hey all! This week, I want to talk a bit about a new love of mine: shell.
While Python was my first programming language, over the years, I have
been doing more and more things in shell. I specifically use Bash
, and I always
seemed to reach for Google whenever I had to do anything remotely complex and beyond the basics.
Rather than dive into a lengthy tutorial and description of various shell features, I wanted to share a “cheat sheet” of my favorites.
Parameter Expansion#
First, to do something with a variable, we’ll use ${ … }
.
Here’s an example of what that would look like:
%%sh
x='hello world'
echo '$x' $x
$x hello world
Parameter Expansion Flags#
To flag doing something with variable, use ${( … ) …}
:
%%sh
x='hello world'
# String slicing
echo '${x:0:8}' ${x:0:5}
echo '${x:5 }' ${x:5}
# Prefix/Suffix Removal
echo '${x#hello}' ${x#hello} # match beginning; delete shortest match
echo '${x%world}' ${x%world} # match trailing; delete shortest match
# Instead of matching on strings, you can also match on patterns
# https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html
# Substitution
echo '${x/hello/hi there}' ${x/hello/hi there}
${x:0:8} hello
${x:5 } world
${x#hello} world
${x%world} hello
${x/hello/hi there} hi there world
Another example:
%%sh
x='hElLo WoRlD'
echo '$x' $x
echo ${x@U} # convert all characters to uppercase
echo ${x@u} # convert first characters to uppercase
echo ${x@L} # convert all characters to lowercase
echo ${x@Q} # quote the parameter so it can be reused
$x hElLo WoRlD
HELLO WORLD
HElLo WoRlD
hello world
'hElLo WoRlD'
Command Substitution#
To swap a command output for text, use $( … )
:
%%sh
echo "Numbers from 1-5: $(seq -s ' ' 1 5)"
Numbers from 1-5: 1 2 3 4 5
Arithmetic Expansion#
To compute arithmetic operations, use $(( … ))
:
%%sh
echo 1 + 2 = $(( 1 + 2 ))
1 + 2 = 3
Redirection#
To redirect data into/out of stdin/stdout/stderr of a process, do the following:
%%sh
temp='/tmp/test.txt'
seq 1 10 > ${temp} && wc -l ${temp} # create a file ${temp} and write the output of `seq` to it
seq 1 5 >> /tmp/test.txt && wc -l ${temp} # add another 5 lines to the file
10 /tmp/test.txt
15 /tmp/test.txt
%%sh
# wc works by reading a file, we could pipe this string into `wc`, or instead
# we can use a herestring that acts like a file
wc -w <<<'this is a sentence'
4
Process Substitution#
Finally, to substitute a process for a filename/file descriptor, use <( … )
>( … )
:
%%sh
echo <( seq 1 10 ) # note that we get a file descriptor out!
grep 3 <( seq 1 10 ) # grep accepts a file as its input- no pipes needed
/dev/fd/63
3
Wrap Up#
I just wanted to share this brief write up of some common syntax I aim to incorporate more of when I use shell. These little tidbits are wildly useful in a variety of contexts and should be kept in mind. Hope you find this useful! Talk to you again next week.