Πώς να πατήσω no σε κάποια εντολή και να συνεχίζει το script

Φτιάχνω την επόμενη έκδοση του LinuxPreparerX και όπως μου είπε κάποιος ότι πρέπει να γνωρίζουν οι χρήστες τι θα βάλει το script. Το τρέχω. Ή εντολή yes λειτουργεί αλλά με το no σταματάει το script:
IMG_20200913_120116
Πείτε μου ακριβώς τη εντολή χρειάζεται για να συνεχίζει το script αντί να σταματάει.

2 Likes

Για να ρωτήσει και να σταματήσει αν πατήσεις κάτι άλλο εκτός από `y’ ή ‘Y’

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
   echo -ne "\nCancelled\n"
    exit 1
fi
echo -ne "\n"

Το μυστικό είναι η κανονική έκφραση (regular experssion) '^[Yy]$'.

Μια ποιο προχωρημένη τεχνική

Αν θέλεις να καταλαβαίνει και ελληνικά (“Ναί/Όχι”), ή για την ακρίβεια την γλώσσα μηνυμάτων (μεταβλητή '$LANG') του χρήστη:

#!/usr/bin/env bash

#
# Ask for yes/no (localized)
# Usage ask_yesno prompt res_var
#

# shellcheck disable=SC2046,SC2254
set -- $(locale LC_MESSAGES)
# set -- '^[+1yYνΝ]' '^[-0nNοΟόΌ]' ναι όχι
yesptrn="$1"; noptrn="$2"; yesword="$3"; noword="$4"
function ask_yesno() {
  local prompt=${1:-}
  local -n _ret=${2:-}
  local response=""

  while [[ -z $response ]]; do
    read -rp "${prompt} (${yesword}/${noword})? :" yn
    case $yn in
      ${yesptrn##^} ) 
        response="yes" 
        break;
        ;;
      ${noptrn##^} ) 
        response="no" 
        break;;
      *) 
        echo "Again: ${prompt} (${yesword} / ${noword})?" ;;
    esac
  done
  
  # shellcheck disable=SC2034
  _ret="$response"
}

ask_yesno "Are you sure?" answer
# shellcheck disable=SC2154
if [ ! "${answer}" == "${yesword}" ]; then
    echo "**Canceled**"
    exit
fi

echo "Let't rock then..."

Υπάρχει πολύ ‘μαγεία’ στο παραπάνω, οπότε δεν θα επιχειρήσω να το εξηγήσω γραμμή γραμμή, αλλά πίστεψε με δουλεύει :-) Τα σχόλια με την λέξη 'shellcheck' είναι για ένα πρόγραμμα που ελέγχει τυπικά λάθη. Ο κώδικάς για την ερώτηση έχει πάει σε μια συνάρτηση, που την έκανα να μοιάζει με μια τυπική συνάρτηση όπως μια γραμμένη σε Python ή C ή τουλάχιστον στο περίπου και αυτό δεν του αρέσει.

Δες και εδώ

είναι για κάτι αντίστοιχο που είχα φτιάξει. Κλέψε με ελεύθερα :slight_smile:.

Ξέρω είναι κάπως ‘προχωρημένα’ παραδείγματα, αλλά αν θέλεις να μάθεις κάτι και δεν καταλαβαίνεις ρώτα. Αλλιώς απλά κάνε μια αντιγραφή. Και αν αποφασίσεις να μάθεις το Bash σε βάθος μια μέρα, θα δεις πως δεν είναι τίποτα το τραγικό.

2 Likes

Ευχαριστώ πολύ για όλες αυτές τις πληροφορίες!

1 Like

Αυτό το νήμα έκλεισε αυτόματα 2 ημέρες μετά την τελευταία απάντηση. Δεν επιτρέπονται πλέον νέες απαντήσεις.