Ошибка: [Слишком много аргументов |СКРИПТ ОБОЛОЧКИ - PullRequest
0 голосов
/ 29 декабря 2018

Ну, мне нужно сравнить все строки в качестве аргументов этого сценария оболочки и сказать, равны ли все они или нет, поэтому я пробую это

#!/bin/bash
#Ejercicio_4
if [ $# -ne 6 ]
  then
        echo Número de argumentos incorrecto
  else
        if [ $1 == $2 == $3 == $4 == $5 == $6 ]

                then
                        echo Son iguales
                else
                        echo No todas las palabras son iguales
        fi
fi

и я пытаюсь думать как $ @ == $ 1но это не сработало: (

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Пока вы используете bash и сравниваете текстовые строки, тест [[..]] безопаснее и более гибок.Вы можете использовать && и || внутри них для операторов и / или операторов.Так что это будет работать:

#!/bin/bash
#Ejercicio_4
if [ $# -ne 6 ]
then
    echo Número de argumentos incorrecto
else
    if [[ "$1" == "$2" && "$1" == "$3" && "$1" == "$4" && "$1" == "$5" && "$1" == "$6" ]]

    then
        echo Son iguales
    else
        echo No todas las palabras son iguales
    fi
fi

Обратите также внимание, что "==" не является действительным синтаксисом в старом тесте "[" , хотя bash принимает его,Вы должны правильно использовать только односимвольный "=" в тестах с одной скобкой.Однако, если вы сравниваете целые числа, вы должны использовать ((..)) .

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

#!/usr/bin/env bash
if [ $# -ne 6 ]
then
    echo "Number of arguments are lesser than required number 6"
else
    number_of_elements=$#
    arguments=("$@")
    first=("$1")
    for (( i=1; i<number_of_elements; i++ )); do
        if [[ "$first" != ${arguments[i]} ]];then
            break
        fi
    done
    if [[ $i -eq $number_of_elements ]];then
        echo "All the argument strings are equal"
    else
        echo "Not equal"
    fi
fi
0 голосов
/ 29 декабря 2018

Оператор для равенства строк обычно равен =.И такие цепи тоже невозможны.Проверьте свои man test.

Обычно вы используете -a для "и" и проверяете каждый аргумент отдельно.

...
if [ $1 = $2 -a $1 = $3 -a $1 = $4 -a $1 = $5 -a $1 = $6 ]; then
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...