【问题标题】:Wrong arguments count in next function calls下一个函数调用中的错误参数计数
【发布时间】:2012-08-07 10:40:58
【问题描述】:

我有函数 ShowJobHistory,它是从另一个调用的。在第一次调用这个函数时一切正常,它计算正确数量的参数,根据我的需要解析它们。但是在接下来的调用中,即使我指定了多个参数,此函数也会将它们视为一个,并且在解析它们后看起来是( jb.RJBGID=12871 12873 12868 )。我的功能有什么问题?

ShowJobHistory () {
conditions=
argCount=$#
if [[ $argCount -ne 0 ]] then
    if [[ $1 == [iI] && $argCount -eq 3 ]] then
        if [[ $2 -lt $3 ]] then
            conditions="( jb.RJBGID between $2 and $3 )"
        else
            conditions="( jb.RJBGID between $3 and $2 )"
        fi
    else
        conditions="("
        for nr in $@
        do
            conditions="${conditions} jb.RJBGID=${nr} or "
        done
        conditions=${conditions%or }
        conditions=$conditions")"
    fi

    typeset query

下面的函数调用 ShowJobHistory。

ShowJobHistoryMenu () {
typeset jobID
save=
echo "Enter jobIDs" 
read jobID?"Enter jobID: "  
while [[ $save != [nNyY] ]]
do
    read save?"Save output to file? [y/n]"
done
if [[ save = [yY] ]] then
    ShowJobHistory $jobID | tee $TRACEDIR/output.txt
else
    ShowJobHistory $jobID
fi
}

【问题讨论】:

  • 你的输入是什么,你得到的输出是什么,预期的输出是什么?
  • 此函数的参数由用户输入,解析的参数是 sql where 语句,如果出现 sql 查询结果,我会收到 sql 错误作为意外输出。
  • ( jb.RJBGID=12871 12873 12868 ) after parsing them. 你是在哪个脚本代码点打印的?
  • 它在sql查询中显示为错误的一部分,但它会在if条件之后打印。打印$#显示1,即使a写了几个参数,例如:12871 12873 12868
  • 您可以尝试使用 $@ 编写一个循环遍历所有参数并更新 argCount(类似于您为 nr 所做的)检查它是否真的得到了这些参数。

标签: linux shell ksh aix


【解决方案1】:

在您的 shell 脚本中设置 IFS=" " 并检查问题是否已解决。

也可以试试这个解决方法:

for nr in `echo $@` [[ Similar to: for nr in $@ ]]
do
   conditions="${conditions} jb.RJBGID=${nr} or "
done

否则:

set -A array $@
for nr in `echo ${array[@]}` [[ Similar to: for nr in ${array[@]} ]]
do
  conditions="${conditions} jb.RJBGID=${nr} or "
done

要得到总数。您可以使用的数组中的元素数:echo ${#array[@]} 并且记住在再次使用数组之前unset array(尽管set -A array 每次调用时都会这样做,只是为了更安全)。

尝试上面给出的所有解决方案,如果还有一些未解决的问题,请告诉我。

【讨论】:

  • 反引号中的echo 不仅没有用,而且在这种情况下是非常错误的。你想要for nr in "$@"
  • 谢谢,为数组设置参数对我有用。但我仍然很好奇,为什么它将参数列表识别为下一个相同的函数调用中的一个。
  • 这不起作用的原因有很多。 IFS(Input Field Separator)是最重要的,需要设置成$@,$*等。正常工作。如果这没有帮助,那么还有其他因素正在影响代码流。
  • 好的,我找到了它不起作用的原因。稍后在代码中,我更改了 IFS 的值以设置另一个数组,因此它具有以前的值。我对代码进行了一些更改,现在 IFS 在函数结束时重置为默认值。非常感谢您的解决方案和提示。
  • 重复;您需要双引号 $@ - 任何其他用法都不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2013-07-23
  • 2013-06-15
  • 2012-02-01
相关资源
最近更新 更多