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

KornShell-使用可能未设置的变量进行测试,shell,unix,scripting,ksh,Shell,Unix,Scripting,Ksh,我在KornShell(ksh)中有以下代码: 在某些情况下,文件名没有扩展名,这会导致file\u EXT变量为空,从而导致以下错误: /script[37]:测试:0403-004使用此命令指定参数。 我应该如何调用此函数以避免出现此错误?[-z“$1”]将测试是否有空的$1,以及[“”=“$1”] 或者,您可以简单地在$1(即“0$1”)前面加上一个“0”,强制它为非空,然后再检查它是否为数字(如果希望将空扩展名视为数字)。我会这样做: if [ isNumeric ${FILE_EXT:

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

在某些情况下,文件名没有扩展名,这会导致
file\u EXT
变量为空,从而导致以下错误:
/script[37]:测试:0403-004使用此命令指定参数。

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

[-z“$1”]
将测试是否有空的
$1
,以及
[“”=“$1”]

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

我会这样做:

if [ isNumeric ${FILE_EXT:="no"} ]; then
    echo "Numbered file."
fi
如果您只想确定文件是否具有数字扩展名


${FILE\u EXT:=“no”}
将扩展为FILE\u EXT的值,如果FILE\u EXT为null或空,则扩展为“no”。

我在运行脚本时遇到了一些问题(可能是因为我使用了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

您应该使用带双“#”的
${FILE##*.}
。另外,变量$FILE\u EXT为空是什么意思?如果您的文件没有扩展名,那么当您执行
${file#*.}
操作时,您将在
文件扩展名中获得正确的文件名。它怎么是空的?

在测试函数的退出代码时,应该去掉方括号,否则,您将始终得到“true”。此外,还应引用变量。您可以对空扩展进行附加测试,如图所示:

FILE_EXT=${FILE#*.}

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

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

假设使用ksh93,应该可以使用它自己的算法。但我们需要小心: 如果n==0,Just((n))将失败,因此我们测试((n | | |!n)),对于任何适当的数字,它都应该是真的

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

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

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

除非文件名以“.”结尾,否则我希望整个文件名都在FILE_EXT中,而不是什么都没有。这不包括以“.”结尾的文件。是的,您应该引用您的变量。对于仅由数字组成的文件名,如果没有点,$FILE_EXT将包含完整文件名,则为假阳性。
function isNumeric { 
  (
    typeset n=${1:?}
    ((n||!n))
  ) 2>& -
}