Linux bash'[:-ge:一元运算符预期'错误

时间:2019-10-19 20:26:40

标签: linux bash shell

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q058460001]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code00.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32

example.test_field: 147
example.test_field: 123

Done.

我尝试了这段代码,它给出了很多错误,

#!/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

任何人都可以帮助我解决此问题。

2 个答案:

答案 0 :(得分:1)

未设置变量decvalue。 您正在使用双引号之外的变量,那么所有命令[ $decvalue -ge ... ]都会变成[ -ge ... ],从而导致错误。

您可以在#!/bin/bash -xv行中使用-x(调试)和/或-v(详细)选项来调试脚本。然后,您将看到并了解会发生什么。相反,您还可以调用set -xv在本地启用调试,然后在要调试的行之后调用set +xv

使用双引号,错误消息会更明确:

bash: [: : integer expression expected

答案 1 :(得分:0)

问题中报告的问题根源是syme所述的空白decvalue

考虑到脚本的用途,似乎您试图编写一个递归函数。因此,我建议您遵循jww关于调试问题的评论!

此外,建议您在recursive functions in 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)"