Por que você está interagindo com mais de $ PWD? isso não é uma lista.
Para iterar todos os argumentos para um script ou função, use
for ARG in "$@"; do
ou a forma abreviada
for ARG;
Você pode usar "shift" para salvar o primeiro parâmetro em uma variável e, em seguida, usar o loop como acima para iterar o restante dos parâmetros.
Para a parte GPG, você só precisa definir outra função com o seu código GPG e, em seguida, chamá-la dentro de sua função "archive" como se fosse um comando shell normal:
gen_password () {
gpg --gen-random 1 "$1" | perl -ne'
s/[\x00-\x20]/chr(ord($^N)+50)/ge;
s/([\x7E-\xDB])/chr(ord($^N)-93)/ge;
s/([\xDC-\xFF])/chr(ord($^N)-129)/ge;
print $_, "\n"'
}
archive () {
ARCHIVE_NAME="$1"
PASSWORD=$(gen_password 32)
shift
for ARG; do
7za a "$ARCHIVE_NAME" "$ARG" -p"$PASSWORD" -mhe
done
echo "Created 7z archive with password '$PASSWORD'"
}