2015-01-24 6 views
2

Я изучаю BASH через HackerRank. Это упражнение, в котором заданы длины треугольника, и тогда вам нужно найти, является ли треугольник равнобедренным, скалярным или равносторонним. I написал следующий код:"Ошибка: слишком много аргументов" в BASH

read a 
read b 
read c 
if [ [ "$a" -eq "$b" ] && [ "$b" -eq "$c" ] ] 
then 
    echo "EQUILATERAL" 
    elif [ [ "$a" -eq "$b" ] || [ "$b" -eq "$c" ] ] 
    then 
    echo "ISOSCELES" 
    else 
    echo "SCALENE" 
    fi 

Но тогда я получаю следующее сообщение об ошибке

solution.sh: line 4: [: too many arguments 
solution.sh: line 7: [: too many arguments 
solution.sh: line 7: [: too many arguments 

Почему это происходит? Я пытался долго и упорно, чтобы исправить это, но ничего не вышло

+0

Хм, я не уверен, как это работает. Я попытался запустить его через терминал, но он не работает - он дает мне ту же ошибку, что и вы, но он также всегда выводит «SCALENE». –

+0

попробуйте использовать '-a' и' -o' вместо '&&' и '||'.они доступны только вне условий, окруженных '[...]'. Кроме того, в состоянии могут возникнуть некоторые проблемы с '[...]'. возможно, используйте paranthesis '(...)' для инкапсуляции подгоночных условий. –

+0

Я добавил -a и -o и вместо 3,2 ошибок появился. Но они были теми же ошибками. –

ответ

2

Вы можете комбинировать условия либо ommiting окружающие скобки, как этот

if [ "$a" -eq "$b" ] && [ "$b" -eq "$c" ] 

или путем объединения условий с -a/-o как этот

if [ "$a" -eq "$b" -a "$b" -eq "$c" ] 

см http://wiki.bash-hackers.org/commands/classictest#and_and_or

0

&& и || являются Баш операторы списка. В цепочке команд следующая команда выполняется, только если предыдущая команда вернула 0 (&&) или отличную от нуля (||).

[ является псевдонимом для внутренней test команды Bash и имеет аргументы, такие как -eq или -ne. ] завершает свою командную строку. Тип help test для получения дополнительной информации.

Итак, если вы пишете условное выражение, вы не ставите операторы списка внутри скобок.

Try, например, это вместо того, чтобы соответствующая строка в коде:

if [ "$a" -eq "$b" ] && [ "$b" -eq "$c" ] 
then 
-1

[ условная команда, как псевдоним для sh «s test встроенной команды.

[[ то же самое для bash, который имеет больше возможностей тестирования.

Так что сделайте выбор между [ и [[, но не [ [, что означает две команды.

Пример:

# [ [ -n 'test' ] ] 
bash: [: too many arguments 
# [ -n 'test' ] && echo $? 
0 
# [[ -n 'test' ]] && echo $? 
0 
+0

Не мой голос, но если '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Только одна команда с недопустимыми параметрами. – kojiro

0

[ не оператор группировки в Баш, вы не можете использовать его для групповых тестов.

существует целый ряд различных способов выразить тесты, которые вы хотите сделать, режим числовой оценки, вероятно, самым простым для чтения

if ((a == b && b == c)) 

if ((a == b || b == c || c == a)) 

Это будет перерыв, если у вас есть десятичные дроби, но будет работать нормально для целых чисел.

Смежные вопросы