如何为变量赋值,哪个名称表示为其他变量bash?

时间:2015-08-26 11:47:10

标签: bash function

我必须为变量赋值,该变量的名称表示为其他变量的值。尝试这个我收到了错误消息:

Tesseract Open Source OCR Engine v3.04.00 with Leptonica
Page 1
Warning in pixReadMemTiff: tiff page 1 not found
script.sh: line 39: SCORE_LIM=8000: command not found
SCORE_LIM=216353

部分代码:

function RecognizeNumber #imagename varoutput
{
    tesseract tmp/$1.tif tmp/$1 -psm 8 nobatch digits > tmp/debug_$1.txt
    "$2"=$(head -n1 tmp/$1.txt | tr -d ' ' | tr -d '-' | tr -d '.')
}

你可以看到我试图为$2分配一些用于其他功能的值:

function ReadScore #geo imgname varoutput sleeptime
{
    sleep $4
    Crop $1 $2
    MakeReadible $2
    RecognizeNumber $2 $3
    echo "$3=$$3"
}

我再次尝试相同:echo "$3=$$3",最可怕的部分是$$3,我刚刚写了,但是t test it (as think it will be value of var with name $ 3`)。

在代码中,我将此函数称为:

ReadScore 135x35+110+130 score SCORE_LIM 1

另一个问题总是显示终端中的输出我试图用> tmp/debug_$1.txt来做,但无论如何它都会出现。

我想我做错了。 :D请求帮助我!

2 个答案:

答案 0 :(得分:0)

使用printf;它比使用eval更安全,这可能会导致正在执行的值出现意外代码。

function RecognizeNumber #imagename varoutput
{
    tesseract tmp/$1.tif tmp/$1 -psm 8 nobatch digits > tmp/debug_$1.txt
    printf -v "$2" "$(head -n1 tmp/$1.txt | tr -d ' .-')"
}

此外,您可以在不使用外部命令的情况下获取和修改值(并始终引用参数扩展):

RecognizeNumber () {
    tesseract tmp/"$1".tif tmp/"$1" -psm8 nobatch digits > tmp/debug_"$1".txt
    read -r value < tmp/"$1".txt
    printf -v "$2" "${value//[ .-]}"
}

间接参数扩展${!name}是安全的。

function ReadScore #geo imgname varoutput sleeptime
{
    sleep "$4"
    Crop "$1" "$2"
    MakeReadible "$2"
    RecognizeNumber "$2" "$3"
    echo "$3=${!3}"
}

答案 1 :(得分:-1)

我在eval命令和${!variable}构建中找到了解决方案:

function RecognizeNumber #imagename varoutput
{
    tesseract tmp/$1.tif tmp/$1 -psm 8 nobatch digits > tmp/debug_$1.txt
    eval $2=$(head -n1 tmp/$1.txt | tr -d ' ' | tr -d '-' | tr -d '.')
}

function ReadScore #geo imgname varoutput sleeptime
{
    sleep $4
    Crop $1 $2
    MakeReadible $2
    RecognizeNumber $2 $3
    echo "$3=${!3}"
}