I’ve never been good at shell scripting. I’d much rather write scripts in a general purpose language like Python. But occasionally a shell script can do something so simply that it’s worth writing a shell script.
Sometimes a shell scripting feature is terse and cryptic precisely because it solves a common problem succinctly. One example of this is working with file extensions.
For example, maybe you have a script that takes a source file name like foo.java and needs to do something with the class file foo.class. In my case, I had a script that takes a La TeX file name and needs to create the corresponding DVI and SVG file names.
Here’s a little script to create an SVG file from a LaTeX file.
#!/bin/bash
latex "$1"
dvisvgm --no-fonts "${1%.tex}.dvi" -o "${1%.tex}.svg"
The pattern ${parameter%word} is a bash shell parameter expansion that removes the shortest match to the pattern word from the expansion of parameter. So if $1 equals foo.tex, then
${1%.tex}
evaluates to
foo
and so
${1%.tex}.dvi
and
${1%.tex}.svg
expand to foo.dvi and foo.svg.
You can get much fancier with shell parameter expansions if you’d like. See the documentation here.