我在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.
我应该如何调用此函数以便我不会收到此错误?
答案 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