Bash: Почему переменная, содержащая строку a, равна строке b в операторе if? - PullRequest
0 голосов
/ 10 марта 2020

Я установил запрос на ввод данных пользователем Yy / Nn. Затем я проверяю, соответствует ли ответ Y / y или N / n. Однако каждый раз он оценивается как «true» в «$ prompt_1» = «Y» / «y», даже когда вы отвечаете N / n. Теперь я уверен, что есть причина, почему, однако поиск вокруг привел меня к нескольким решениям IG: Qoutes вокруг переменных. Но ничего не помогло решить эту проблему.


#!/bin/bash



clear;
echo "Would you like to proceed with installation?"
read prompt_1;

echo $prompt_1;

if [ "$prompt_1"="Y" ] || [ "$prompt_1"="y" ]; then
  echo "You've accepted installation";


elif [ "$prompt_1”="N"] || [ “$prompt_1"="n" ]; then
  exit;
fi


Ответы [ 3 ]

3 голосов
/ 10 марта 2020

Вам необходимо добавить пробелы вокруг оператора =:

if [ "$prompt_1" = "Y" ] || [ "$prompt_1" = "y" ]; then
  echo "You've accepted installation";
elif [ "$prompt_1" = "N" ] || [ "$prompt_1" = "n" ]; then
  exit;
fi

Или использовать оператор сопоставления с образцом =~ в выражении [[...]]:

if [[ "$prompt_1" =~ ^[Yy]$ ]]; then
    echo "You've accepted installation";
elif [[ "$prompt_1" =~ ^[Nn]$ ]]; then
    exit
fi
0 голосов
/ 10 марта 2020

Другое предложение, использующее case и замену в нижнем регистре:

case ${prompt_1,,} in
    y|yes|"just do it")
        echo "You've accepted installation"
        # perform installation
        ;;
    n|no|forget) exit;;
    *) echo "Wrong answer, try again";;
esac

PS: работает в bash4 или новее.

0 голосов
/ 10 марта 2020

Решение оператора case.

case $prompt_1 in
  [Yy]) echo "You've entered $prompt_1 and accepted installation."
  ##: do something here 
  ;;
  [Nn]) echo "You entered $prompt_1 and did not accepted the installation."
   exit
   ;;
  *|'') echo "Unknown option ${prompt_1:-empty}."  ##: not [Nn] or [Yy] or empty.
   exit
  ;;
esac
  • Это больше не ограничено bash, оно должно работать и на других оболочках POSIX sh.
...