1

我的 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 行。我陷入了这个问题。请帮我解决问题。

4

2 回答 2

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

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

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

我希望这有帮助。

于 2012-05-24T14:31:35.327 回答
0

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

例子.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
于 2014-01-11T23:16:20.540 回答