Современный Bash-скрипт должен явно обрабатывать ошибки, заключать переменные в кавычки и проходить ShellCheck.

Важно: set -e не заменяет обработку ожидаемых ошибок. Проверяйте коды возврата там, где отказ допустим.

1. Создайте каркас

#!/usr/bin/env bash
set -Eeuo pipefail

main() {
  local name=${1:-world}
  printf 'Hello, %s!\n' "$name"
}

main "$@"

2. Сделайте исполняемым

chmod 0755 hello.sh
./hello.sh VPS

3. Проверяйте условия и массивы

files=("one file.txt" "two.txt")
for file in "${files[@]}"; do
  [[ -e $file ]] && printf '%s exists\n' "$file"
done

4. Запустите статическую проверку

sudo apt install shellcheck
shellcheck hello.sh
bash -n hello.sh

Официальная документация