Am Fri, Jun 13, 2025 at 10:44:05PM -0500 schrieb Dale:
Howdy,
As most know, I ordered some books about writing scripts. A couple
things are not making sense to me. Yet. This is the basics of a script
I want to write.
If you have a script with many sections that depend on one another, you can write it as one long script, or to make it more digestible when you read it
a few years later, put blocks of code into functions and then call those functions from the main scope, like so:
check_prereqs() {
...
}
do_stuff() {
...
}
cleanup() {
...
}
# main scope: call the above functions
check_prereqs
do_stuff
cleanup
To get flow control, it is common to have early return on error. That means: as soon as you encounter a problem that your script cannot handle, have the script exit. This is preferable over nested if-else-structures.
You can take it to the extrem with the statement `set -e`. This causes the script to terminate as soon as any of its commands returns != 0 unhandled. That means if you want the script to continue, you need to “catch” any possible error case yourself with `if` or a || construct, as in:
mountpoint /some/path || echo "/some/path is not a mountpoint."
The disadvantage: the script becomes more verbose.
The advantage: you might discover bugs that you never thought of and you
make the script safer.
Section one. See if a encrypted partition is open or not. I use cryptsetup to open/close.
If open, print that it is open then go to mount part of script in
section two.
Pseudo code for the first section:
if check_container_is_open then
print "container is open"
else
open_container
if not check_container_is_open then
print "Failed to open container."
exit
fi
print "container is now open"
fi
Note that I did not put the last print into an else. Because if the script encountered the problem case, it would have exited anyways.
If not open, ask for pass phrase and confirm it is open. Then go to
section two.
Section one done, or fi.
Section two. Is unencrypted file system mounted.
If mounted, print that it is mounted and exit.
If not mounted, mount and confirm mount and then exit. If mount fails, print error.
Section two done, or fi.
Here's the thing I can't figure out. Let's say the I need section one
to go to section two at a certain point, maybe because the encrypted
file system is already open as shown above, how do I tell it to skip to section two?
As others mentioned, put the sections into functions, call the functions in sequence and let the functions return early if necessary.
Also, if something goes bad, how do I tell it to print out that
something went wrong and stop?
I tend to define a function called die in all my scripts that require an
early exit on error:
die() {
print "$@" > /dev/stderr
exit 1
}
Then, instead of a print, you simply put this into the script:
die "LUKS container could not be opened."
The book I'm reading is Linux command: Advanced methods and strategies
to shell scripting by William Vance. I don't know who the guy is but it
is the one with the newest copyright date. 2020. It's basically the
same info as all the other books which still has me clueless on the
above info. In the old Basic days with Vic-20 puters, we had goto to
move from one part of a program to another. No idea on bash tho.
Also, someone posted about mountpoint -q. That will help with section two. Is there a way to find out if a file system is open using
cryptsetup or some other command that I can put in a script?
lsblk comes to mind. I guess it just reads internal data from /sys or /dev
and puts it into a nice readable form.
frank@q ~ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 102,9M 1 loop /mnt/data/audio/sid/hvsc/C64Music nvme0n1 259:0 0 1,8T 0 disk
├─nvme0n1p1 259:1 0 300M 0 part /boot
├─nvme0n1p2 259:2 0 16M 0 part
├─nvme0n1p3 259:3 0 195,2G 0 part /mnt/windows
└─nvme0n1p4 259:4 0 1,6T 0 part
└─root 253:0 0 1,6T 0 crypt
├─vg-root 253:1 0 50G 0 lvm /
├─vg-home 253:2 0 200G 0 lvm /home
├─vg-gentoo 253:3 0 50G 0 lvm /mnt/gentoo
└─vg-data 253:4 0 1,3T 0 lvm /mnt/data
To make parsing easier, you can define the colums to display yourself. Then only output type and mointpoints, grep for lines beginning with crypt (to
not catch lines that have “crypt” in the mountpoint) and lastly grep for the
mountpoint, if needed:
lsblk --option-for-your-columns | grep ^crypt | grep "$YOUR_MOUNTPOINT"
--
Grüße | Greetings | Salut | Qapla’
Please do not share anything from, with or about me on any social network.
If I wanted to sit in a Mercedes Benz, I’d call for a taxi.
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEVbE9o2D2lE5fhoVsizG+tUDUMMoFAmhPMscACgkQizG+tUDU MMoI4A//c2HOk8qX22x0InS0vTXDPzmH32wUbgx/4DF9M3SmM1rphnboXbq3fCOh 8V8Udq92kdrdEwO5O1vDwg68yV9XvYJeAzf5FuSarWmsDS44fBy+z0Mv42QHILCS 1A8XWE0qdREX7ptln6DmT5tZ6qrkXtp/6yb3zeux9bJoJD7Vfse/WhFEj5Xy31kb aeEYr5OAScWVmm+j2KJCBKfL1JPKpRJ0eTWwmqkDNJKqGyM+Qj5ZmRMp3nPiK0pY Hnb3ZYjsdTOIxj5djWf7oduHH6gXTOJWS8jFR3/i5FyXW/mo26ePskurIdiFB6Rs zbR662Al+tAzKWcHsHcWe5hOhpCFtxHrXxXL5N0q1Cu3a12XhJMBnOsLE1HzDPAy M1OIpWfmV0XkaERspI/NLg7pmHs+iyig2n1pT4ZFq1+COCW0930R5Fd/odOaK6Gg 8S13/UgjOMqh8oOc2lqVy55dYzWjsAEe3kI7U9GepS4ZGamfdQZZSVpvSs5LAMdn f4/AgoNThI1ibw1A27rLmuWfMWXKCvUU7t53ugYp/hNm6nueBKC4Khc1WQXxGxxJ s8gBQ393AM/csx9Qm25R7zj4FWYIdSsDVoADqWoCe2c3prwAAr46JPb354fCYt6J CIPEfGT6qQ8jRJEY2gQqTJacuG3uFReXyV5ORfOFuTBUUr4UzxA=
=Q9bm
-----END PGP SIG