Linux bash '[: -ge: ожидается унарный оператор' 'ошибка - PullRequest
0 голосов
/ 19 октября 2019
#!/bin/bash


SubValue()
{


  romanvalue="${romanvalue}$2"
  decvalue=$(( $decvalue - $1 ))

}

if [ $decvalue -ge 1000 ] ; then
  SubValue 1000 "M"
elif [ $decvalue -ge 900 ] ; then
  SubValue 900 "CM"
elif [ $decvalue -ge 500 ] ; then
  SubValue 500 "D"
elif [ $decvalue -ge 400 ] ; then
  SubValue 400 "CD"
elif [ $decvalue -ge 100 ] ; then
  SubValue 100 "C"
elif [ $decvalue -ge 90 ] ; then
  SubValue 90 "XC"
elif [ $decvalue -ge 50 ] ; then
  SubValue 50 "L"
elif [ $decvalue -ge 40 ] ; then
  SubValue 40 "XL"
elif [ $decvalue -ge 10 ] ; then
  SubValue 10 "X"
elif [ $decvalue -ge 9 ] ; then
  SubValue 9 "IX"
elif [ $decvalue -ge 5 ] ; then
  SubValue 5 "V"
elif [ $decvalue -ge 4 ] ; then
  SubValue 4 "IV"
elif [ $decvalue -ge 1 ] ; then
  SubValue 1 "I"
fi

Я пробовал этот код, и он дает много ошибок, которые

dectoroma.sh: line 13: [: -ge: unary operator expected dectoroma.sh: line 15: [: -ge: unary 
operator expected
dectoroma.sh: line 17: [: -ge: unary operator expected
dectoroma.sh: line 19: [: -ge: unary operator expected
dectoroma.sh: line 21: [: -ge: unary operator expected
dectoroma.sh: line 23: [: -ge: unary operator expected
dectoroma.sh: line 25: [: -ge: unary operator expected
dectoroma.sh: line 27: [: -ge: unary operator expected
dectoroma.sh: line 29: [: -ge: unary operator expected
dectoroma.sh: line 31: [: -ge: unary operator expected
dectoroma.sh: line 33: [: -ge: unary operator expected
dectoroma.sh: line 35: [: -ge: unary operator expected
dectoroma.sh: line 37: [: -ge: unary operator expected

может кто-нибудь помочь мне решить эту проблему, пожалуйста.

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Переменная decvalue не установлена. Вы используете переменные вне двойных кавычек, тогда все команды [ $decvalue -ge ... ] становятся [ -ge ... ], что приводит к ошибке.

Вы можете отлаживать свой скрипт, используя -x (debug) и / или -v (verbose)вариант для линии #!/bin/bash -xv. Затем вы увидите и поймете, что происходит. Вместо этого вы также можете вызвать set -xv, чтобы включить локальную отладку, а затем set +xv после строк, которые хотите отладить.

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

bash: [: : integer expression expected

0 голосов
/ 20 октября 2019

Источником проблемы, о которой сообщается в вопросе, является пустое значение decvalue, поскольку syme уже указано.

Учитывая цель сценария, кажется, вы пытались написатьрекурсивная функция. По этой причине я предлагаю вам следовать комментарию под вашим вопросом от jww относительно отладки!

Более того, вам предлагается искать вопросы по рекурсивным функциям в bash по SO. В bash есть отличные ответы для факторных вычислений.

Подумайте, какие количества «транспортируются», а какие возвращаются / компилируются в конце.


Если вы действительно застряли, вы найдете 90% решения ниже.

#!/bin/bash
romanLetters(){
        local decvalue=$1
        local roman
        declare -i decvalue

        if [ $decvalue -ge 1000 ]; then
                romanvalue="M$(romanLetters $((decvalue - 1000)))"
                echo $romanvalue
        elif [ $decvalue -ge 900 ]; then
                romanvalue="CM$(romanLetters $((decvalue - 900)))"
                echo $romanvalue
        # ... and so on ...
        fi
}

echo "1900: $(romanLetters 1900)"
...