ksh中的算术语法错误if condition

时间:2012-05-24 14:25:59

标签: shell unix scripting ksh

我的KornShell(ksh)脚本的一部分如下。

let "value=`awk NR==14 ${TEMP_DIR}/IR4723/count_part_UNVM.txt`"
let "var= value"
if [ $var -gt 0 ]
then
load_data ${count_part[$i]}
fi

脚本上面部分的第一行抛出以下错误:

arithmetic syntax error LOADTODB/ShellsAndSQLs/IR4723/load_gen_tmp_tab.ksh[84]: test: 8

以上脚本从文件count_part_UNVM.txt值8读取第14行。 我陷入了这个问题。请帮我解决问题。

2 个答案:

答案 0 :(得分:1)

这是一个错字,还是你错过了价值前面的'$',即(你的第二行)

let "var=$value"

我认为应该是

let var="$value"

通过启用shell调试功能,您可以在构建脚本时消除许多问题,即

 set -vx
 let "var= value"
 set +vx

或者将set -vx放在脚本顶部附近,看看如何处理所有脚本。

EDIT3 或在-vx后面#!/bin/bash放置#!/bin/bash -vx,即let value="$(awk 'NR==14' ${TEMP_DIR}/IR4723/count_part_UNVM.txt)"

EDIT2 我错过了您的第一条评论,是的,第1行看起来也有问题。试试这个

$( )

请注意,使用cmd替换的反引号在'New Kornshell Language'~1995中被声明为已弃用。print --"value=XX${value}XX cmd-substition很容易嵌套,是您最好的选择。 另请注意,awk脚本(在cmdline上)应该作为单个参数呈现,方法是用单引号或dbl引号括起来。 (但我并不完全确定你需要引用,因为你的'程序'中没有空格。)如果修订版不起作用,请在作业后添加set -vx并编辑上面的问题以显示输出

编辑根据您的评论/问题,周围有一些shell脚本调试程序,但我从不使用它们。如果您真的想尝试,请搜索Rosenberg ksh book调试器。

print -- "var=XX${var}XX"应该被称为“执行跟踪”。它会在执行代码之前显示代码行或代码块,然后将任何变量扩展为其值。这是人们调试ksh脚本的典型方式。您还可以添加{{1}}等语句来查看变量的各个值,但这可能会使您的输出变得混乱,并且可能需要您转换这些参数,从而迫使您再次编辑脚本。

我希望这会有所帮助。

答案 1 :(得分:0)

为什么在ksh中使用let?以下是对您的代码的建议。

<强> example.ksh

#!/bin/ksh

#Initialize Varables
TEMP_DIR=tempDir/IR4723
var=""

initialize(){
    echo "Entering initialize"

    echo "Exiting initialize"
}
function1(){
    echo "Entering function1"
    echo ${PWD}
    file=${PWD}/${TEMP_DIR}/count_part_UNVM.txt
    readLine "${file}"
    echo "var: "${var}
    if [[ ${var} -gt 0 ]]; then
        load_data ${count_part[$i]}
    fi
    echo "Exiting function1"
}
createDir(){
    echo "Entering createDir"
    mkdir -p ${1}
    echo "Exiting createDir"
}
createFileWithRandomCount(){
    echo "Entering createFileWithRandomCount"
    orgDirectory=${PWD}
    cd ${1}
    > ${2}
    print ${RANDOM} >> ${2}
    cd ${orgDirectory}
    echo "Exiting createFileWithRandomCount"
}
readLine(){
    echo "Entering readLine"
    file=${1}
    while read line
    do
        # display line or do somthing on $line
        var="$line"
    done <"$file"
    echo "Exiting readLine"
}
load_data(){
    echo "Entering load_data"
    echo "Exiting load_data"
}

#-----------
#---Main----
#-----------
echo "Starting: "${0}" with Input Parameters: {1: "${1}" {2: "${2}" {3: "${3}
initialize #function call#
createDir ${TEMP_DIR} #function call#
createFileWithRandomCount ${TEMP_DIR} count_part_UNVM.txt #function call#
function1 #function call#

<强>输出:

$ ksh -i example.ksh
Starting: example.ksh with Input Parameters: {1:  {2:  {3:
Entering initialize
Exiting initialize
Entering createDir
Exiting createDir
Entering createFileWithRandomCount
Exiting createFileWithRandomCount
Entering function1
/tmp
Entering readLine
Exiting readLine
var: 11984
Entering load_data
Exiting load_data
Exiting function1