KornShell-使用可能未设置的变量进行测试
我在KornShell(ksh)中有以下代码: 在某些情况下,文件名没有扩展名,这会导致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:
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>& -
}