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

それはタイプミスですか、それとも値の前に「$」がありませんか、つまり(2行目)

let "var=$value"

私が本当にそうあるべきだと思う

let var="$value"

シェルのデバッグ機能をオンにすることで、スクリプトを作成している間に多くの問題を解決できます。

 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)"

cmd-substitution にバッククォートを使用することは、'New Kornshell Language' ~ 1995$( )で非推奨として宣言されたことに注意してください。また、awk スクリプト (コマンドライン上) は、単一引用符または dbl 引用符で囲むことにより、単一の引数として提示する必要があることに注意してください。(ただし、「プログラム」にスペースが含まれていないため、引用符が必要かどうかは絶対にわかりません。) リビジョンが機能しない場合はprint --"value=XX${value}XX、割り当ての後に追加し、上記の質問を編集して出力を表示します。

編集コメント/質問ごとに、いくつかのシェルスクリプトデバッガーがありますが、私はそれらを使用しません。本当に試してみたい場合は、Rosenberg ksh book debugger を検索してください。

これset -vxは、実際には「実行トレース」と呼ばれるべきです。実行前のコードの行またはブロックが表示され、その後、変数がその値に展開されます。それは、人々が ksh スクリプトをデバッグする典型的な方法です。変数の個々の値を表示するなどのステートメントを追加することもできprint -- "var=XX${var}XX"ますが、出力が台無しになる可能性があり、それらのステートメントを無効にする必要があり、スクリプトを再度編集する必要があります。

これが役立つことを願っています。

于 2012-05-24T14:31:35.327 に答える
0

なぜletkshで使用しているのですか?これがあなたのコードの提案です。

たとえば .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 に答える