【问题标题】:arithmetic syntax error in ksh if condition如果条件,ksh 中的算术语法错误
【发布时间】:2012-05-24 14:25:58
【问题描述】:

我的部分 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 行的脚本。 我被困在这个问题上。请帮我解决问题。

【问题讨论】:

    标签: shell unix scripting ksh


    【解决方案1】:

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

    let "var=$value"
    

    我认为应该是这样的

    let var="$value"
    

    您可以在构建脚本时通过打开 shell 调试功能来消除很多问题,即

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

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

    EDIT3 或将-vx 放在第一行的#!/bin/bash 之后,即#!/bin/bash -vx

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

    let value="$(awk 'NR==14' ${TEMP_DIR}/IR4723/count_part_UNVM.txt)"
    

    请注意,在 1995 年的“新 Kornshell 语言”中,将反引号用于 cmd-substition 已被声明为已弃用。$( ) 用于 cmd-substition 很容易嵌套,是您最好的选择。 另外,请注意 awk 脚本(在 cmdline 上)应作为单个参数呈现,并用单引号或 dbl 引号括起来。 (但我不确定您是否需要引号,因为您的“程序”中没有空格。)如果修订不起作用,请在分配后添加 print --"value=XX${value}XX 并编辑上面的问题以显示输出。

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

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

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。第二行是错误的。但我在上面脚本的第一行出错了。是值空间问题还是值是从文件中复制的字符串?
    • 嗨 Shellter,我也想知道如何调试脚本。我将 -vx 添加到我的 shell 脚本中。但看不到变化。能否请您参考我详细解释的链接?
    【解决方案2】:

    你为什么在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2018-11-26
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      相关资源
      最近更新 更多