I'm pretty new to bash scripting. I want a script that I can run in a directory that contains .md
files, runs pandoc on them, and delivers the output to a sibling folder html
, i.e. my folder structure is like this:
.
├── html
└── md
Here is what I have working, I just don't know if I'm following good practices or if there's a nicer / more readable way of doing what I'm doing.
#! /bin/bash
# run this from a folder containing markdown files
# it delivers html to the sibling html folder
if hash pandoc 2>/dev/null; then
for file in ./*.md ; do
echo Converting $file
cat "$file" | pandoc -o "$(echo $file | sed 's/^./..\/html/' | sed 's/.md$/.html/')"
done
else
echo "I need pandoc installed"
fi
1 Answer 1
UUOC .
pandoc
takes the input file name as an argument.echo $file | pandoc -o outfile
is equivalent topandoc -o outfile $file
. One process invocation down.UUOS (
sed
in this case).bash
has very rich string transformation features built in. For example,${file%md}
(seeParameter expansion
section ofman bash
) will strip themd
suffix form the filename. So considerfor file in *.md; do pandoc -o ../html/${file%md}html done
Two more process invocations down.
If by any chance an
.md
filename contains funny characters (like whitespace), the substitution will produce unexpected results. It is safer to use double quotes, as in `"${....}".
PS: It might be beneficial to abandon the shell script altogether in favor of make
, with a Makefile
having a single stem rule
../html/%.html: %.md
pandoc -o $@ $<
-
1\$\begingroup\$ Awesome thank you! My workplace actually has an award for UUOC, I think I'll need to apply for it :) \$\endgroup\$russau– russau2018年11月17日 20:44:05 +00:00Commented Nov 17, 2018 at 20:44
-
\$\begingroup\$ Thanks again for your help. My script has evolved a bit since I asked the original question. Interested to know if there's a nicer way to pass an optional parameter to pandoc. \$\endgroup\$russau– russau2018年11月17日 20:51:12 +00:00Commented Nov 17, 2018 at 20:51
-
1\$\begingroup\$ If you've got a new version of the code it is time for a new code review. It is ok to open a new question on here with modified code. It is nice to link to the previous question too. \$\endgroup\$chicks– chicks2018年11月18日 02:20:04 +00:00Commented Nov 18, 2018 at 2:20