KornShell - 使用可能未设置的变量进行测试

时间:2009-12-11 21:49:50

标签: shell unix scripting ksh

我在KornShell(ksh)中有以下代码:

FAILURE=1
SUCCESS=0

isNumeric(){

    if [ -n "$1" ]; then
        case $1 in
            *[!0-9]* | "")  return $FAILURE;
                       * )  return $SUCCESS;
        esac;
    else
        return $FAILURE;
    fi;
}

#...
FILE_EXT=${FILE#*.}

if [ isNumeric ${FILE_EXT} ]; then
    echo "Numbered file."
fi
#...

在某些情况下,文件名没有扩展名,这会导致FILE_EXT变量为空,这会导致以下错误: ./script[37]: test: 0403-004 Specify a parameter with this command.

我应该如何调用此函数以便我不会收到此错误?

6 个答案:

答案 0 :(得分:5)

当您测试函数的退出代码时,应该不使用方括号,否则,您将始终获得“true”。另外,你应该引用你的变量。您可以为空扩展进行额外测试,如下所示:

FILE_EXT=${FILE#*.}

if isNumeric "${FILE_EXT}" &&
    [ "${FILE_EXT}" != "${FILE}" -a "${FILE_EXT}" != "" ]
then
    echo "Numbered file."
fi

编辑添加了测试以处理以“。”结尾的文件名

答案 1 :(得分:1)

我会这样做:

if [ isNumeric ${FILE_EXT:="no"} ]; then
    echo "Numbered file."
fi

如果你想要做的就是确定文件有一个数字扩展名

${FILE_EXT:="no"}将扩展为FILE_EXT的值,如果FILE_EXT为null或为空,则为“no”。

答案 2 :(得分:1)

你应该用${FILE##*.}代替双“#”。还有什么意思变量$ FILE_EXT将为空?如果您的文件没有扩展名,那么当您执行${FILE#*.}时,您将在FILE_EXT中获得正确的文件名。它怎么空?

答案 3 :(得分:1)

假设ksh93,应该可以使用它自己的算术。但我们需要小心: 如果n == 0,则((n))将失败,因此我们测试((n ||!n))对于任何正确的数字应该始终为真。

为了防止ksh退出,我们在子shell()中运行表达式,添加空格以防止与算术表达式((...)冲突)。

最后,我们用'2>&关闭stderr。 - '以防止来自非数字参数的任何错误消息,尽管您可能希望将它们保留在其中。

function isNumeric { 
  (
    typeset n=${1:?}
    ((n||!n))
  ) 2>& -
}

答案 4 :(得分:0)

[ -z "$1" ]将测试空$1[ "" = "$1" ]也是如此。

或者你可以简单地在$1之前添加一个“0”(即"0$1")以强制它为非空,然后再检查它是否为数字(如果你想要空的扩展名被处理作为数字)。

答案 5 :(得分:0)

我有一些probs来运行你的脚本(也许那是因为我正在使用pdksh)。所以我稍微调整了一下。试试这个:

#!/usr/bin/ksh

FILE=$1
FAILURE=1
SUCCESS=0

isNumeric ()
{
    if [ -n "$1" ]
    then
        case $1 in
            *[!0-9]* | "")
                echo "$1 not a number"
                return $FAILURE
            ;;
                       * )
                echo "$1 is a number"
                return $SUCCESS
            ;;
        esac
    else
        echo "parameter is empty"
        return $FAILURE
    fi
}

#...
FILE_EXT=${FILE#*.}
echo $FILE_EXT

isNumeric "${FILE_EXT}"
if [ "$?" = "0" ]
then
    echo "Numbered file."
fi