2016-12-13 3 views
0

Я пишу сценарий оболочки, чтобы взять число от 1 до 7 в командной строке и вернуть соответствующий день недели. Мой код в настоящее время выглядит так:bash - инструкция elif возвращает то же значение независимо от ввода

#!/bin/bash 
echo "Please enter a number between 1 and 7 >" 
read number 
number=$n 
if [ "$n"=="1" ] 
then 
echo "Monday" 
elif [ "$n"=="2" ] 
then 
echo "Tuesday" 
elif [ "$n"=="3" ] 
then 
echo "Wednesday" 
elif [ "$n"=="4" ] 
then 
echo "Thursday" 
elif [ "$n"=="5" ] 
then 
echo "Friday" 
elif [ "$n"=="6" ] 
then 
echo "Saturday" 
elif [ "$n"=="7" ] 
then 
echo "Sunday" 
else 
echo "error" 
fi 

это возвращает «понедельник» независимо от ввода. Если я добавлю пробелы с каждой стороны из ==, тогда он возвращает «ошибку» независимо от ввода! Я пробовал различные вещи, но не могу понять, почему

+1

Пожалуйста, обратите внимание: http://www.shellcheck.net/ – Cyrus

+0

Ваш код AWK, конечно, не так: вы получите значение в 'number' переменной, но то вы используете другую переменную в сравнении (переменная 'n'). Переменная 'n' представляется неопределенной. – Jdamian

+0

@ Кир говорит, что проблема в строке 4 'number = $ n'. Я думаю, что значение, которое он читает, ака 'номер', не присваивается' $ n', но я не понимаю, почему – pxdr0

ответ

3

Замените следующие строки кода

read number 
number=$n 

с этими

read number 
n="$number" 

обновление 1: баш сравнениями в формате [ "$n"=="x" ] всегда возвращайте код 0 (true), независимо от значения x, потому что тест [ string ] проверяет, является ли string NULL o r нет. Другими словами, не используется пустым, первый if предложение кода всегда true, независимо от значения переменной n и значения "x"

+0

, а затем я использую' $ n' для моих сравнений? например 'if [" $ n "==" 1 "]' – pxdr0

+0

В bash для сравнения межсетевого экрана это было бы более правильным, если ["$ n" -eq 1] '. Обратите внимание на пространство между всеми элементами. –

+0

@JamilSaid раньше имел пробелы и произвел другую ошибку. В любом случае, добавлено изменение, и все это работает сейчас. Благодаря! – pxdr0

2

Я видел то же самое, как Jdamian но оказывается недостаточным так, поскольку вы работаете с номером было бы prefable работать с -eq вместо так:

if [ $n -eq 1 ]; then echo "Monday"; elif [ $n -eq 2 ]; then echo "Tuesday"; elif [ $n -eq 3 ]; then echo "Wednesday"; elif [ $n -eq 4 ]; then echo "Thursday"; elif [ $n -eq 5 ]; then echo "Friday"; elif [ $n -eq 6 ]; then echo "Saturday"; elif [ $n -eq 7 ]; then echo "Sunday"; else echo "error"; fi 

вы можете заменить; новая линия, если вам не нравится формат один лайнер

на другую ноте, если мег грязных, если, как в этом нет необходимости, я предложил бы использовать случай вместо для лучшей читаемости:

case $n in 
    1) echo "Monday" ;; 
    2) echo "Tuesday" ;; 
    3) echo "Wednesday" ;; 
    4) echo "Thursday" ;; 
    5) echo "Friday" ;; 
    6) echo "Saturday" ;; 
    7) echo "Sunday" ;; 
    *) echo "error" ;; 
esac 
+0

спасибо за это. Примеры случаев, которые я рассмотрел до сих пор, не продемонстрировали, что они сделали так ясно, как это, поэтому я не рассматривал это как вариант. Обычно я предпочитаю, чтобы все было как можно более аккуратно и лаконично! – pxdr0

+0

однако для этого вам нужен ответ Jdamian и присвойте значение числа n вместо другого, потому что, как вы его написали, вы назначаете значение read to number, затем вы переопределяете число, назначая значение $ n, которое является необъявленной переменной, обнуляющей значение числа – Mike

1

массив может быть проще:

#!/bin/bash 
day=(Monday Tuesday Wednesday Thursday Friday Saturday Sunday) 

read -p "Please enter a number between 1 and 7 >" n 
echo "${day[n-1]}" 
Смежные вопросы