# General
Always include a shebang, and set options to exit the script when a command fails or when we use a variable that's not set:
#!/bin/bash
set -eu
# Test for existence with `-e`, not `-d`
If `wifi_pass_dir` exists, but is not a directory (perhaps it's a plain file), it will not be deleted, and the `mkdir` will fail. It might be better not to check (`rm -f` will succeed if the file doesn't exist):
# Ensure the wifi_pass_dir exists
rm -rf wifi_pass_dir
mkdir wifi_pass_dir
However, I don't believe it's necessary to copy the config files to an insecure location and make them world readable (and writeable) - see later.
# `sudo` is for interactive use, not scripts
Avoid using `sudo` in a script - it expects to be interactive, and won't necessarily do what you want if not connected to a terminal. It's easier to require that the script be run under `sudo` (and we can then use `su` to change to a non-privileged user where necessary).
# Don't parse the output of `ls`
Filenames you don't control can contain all sorts of characters, including newlines. Here, we don't need to do that, as we're reading from a directory. The `while read` loop can simply be a `for f in *` loop.
# Don't over-exercise the `cat`
This `cat` isn't needed:
cat "$name" | grep psk=
Just tell `grep` to take its input from `$name` directly:
grep psk= "$name"
We don't even need a loop, as we can pass all the filenames to `grep` in one go.
---
# Simplified code
#!/bin/bash
exec grep 'psk=' /etc/NetworkManager/system-connections/*
Yes, that's the whole program. Since we only execute one command, we don't need `set -e`, and as we use no variables, neither do we need `set -u`.