4

我在 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.

我应该如何调用此函数以免出现此错误?

4

6 回答 6

5

当你测试一个函数的退出代码时,你应该去掉方括号,否则,你总是会得到“真”。此外,您应该引用您的变量。您可以对空扩展名进行额外测试,如下所示:

FILE_EXT=${FILE#*.}

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

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

于 2009-12-12T00:54:03.890 回答
1

我会这样做:

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

如果您只想确定文件具有数字扩展名

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

于 2009-12-11T22:08:00.257 回答
1

你应该使用${FILE##*.}双“#”代替。还有你是什么意思变量 $FILE_EXT 将为空?如果您的文件没有扩展名,那么当您这样做时,${FILE#*.}您将在FILE_EXT. 怎么是空的?

于 2009-12-12T00:03:38.313 回答
1

假设 ksh93,应该可以使用它自己的算术。但是我们需要小心:如果 n==0,只有 ((n)) 会失败,所以我们测试 ((n || !n)) ,对于任何适当的数字,它都应该始终为真。

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

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

function isNumeric { 
  (
    typeset n=${1:?}
    ((n||!n))
  ) 2>& -
}
于 2011-03-20T02:26:03.707 回答
0

[ -z "$1" ]将测试一个空的$1,因为会[ "" = "$1" ]

或者您可以简单地在$1(即"0$1")前面加上一个“0”来强制它为非空,然后再检查它是否为数字(如果您希望将空扩展名视为数字)。

于 2009-12-11T22:05:24.087 回答
0

我有一些问题可以运行你的脚本(也许那是因为我正在使用 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
于 2009-12-11T23:17:10.903 回答