bash while while循环无意中在true之后结束if

时间:2012-10-14 23:52:17

标签: bash if-statement while-loop

可能是一个愚蠢的问题,但看不到中止的原因。

我有一个这样的文件:

"id": "00000000000000000",
"visibilitystate": 1,
"profilestate": 8
"somethingelse": "abc",
"id": "99999999999999999",
"againsomethingelse": "cba"
"visibilitystate": 0,
"profilestate": 9

一百万或更多的重复,数字,名称和值可以在id和id之间不同,但id总是不同的。 我的第一个想法是在一个循环中读取,将值存储在一个数组中,然后插入到mysql-db中。

我试试这个:

set -x
#Data extract array
array=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

#Control array
array2=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)

while read a; do
    if [[ ${array2[0]} == 1 ]]; then
        awk '/"id":/ { exit 42 }'
        if [[ $? -eq 42 ]]; then
            echo mysql
            array2[0]=0
        fi
    fi
    if [[ ${array2[0]} == 0 ]]; then
        awk '/"id":/ { exit 42 }'
        if [ $? -eq 42 ]; then
            array[0]=`sed -n 's/.*"id":."\(.*\)",.*/\1/p'`
            array2[0]=1
        fi
    fi
done <testf

set +x

读完一行后,循环退出,不明白为什么。

输出:

+ array=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
+ array2=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
+ read a
+ [[ 0 == 1 ]]
+ [[ 0 == 0 ]]
+ awk '/"id":/ { exit 42 }'
+ '[' 42 -eq 42 ']'
++ sed -n 's/.*"id":."\(.*\)",.*/\1/p'
+ array[0]=
+ array2[0]=1
+ read a
+ set +x

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

脚本中有3个问题。您正在循环中使用3个不同的命令从stdin读取(awk两次和sed)。

使用awk '/"id":/ { exit 42 }'时,它会读取其他所有内容(输入文件)。您可能希望在$a中应用该命令。那将是这样的:

echo $a | awk '/"id":/ { exit 42 }'

第二个错误是相同的,但在下一个if

第三个错误类似,但在这种情况下使用sed时。你可能想做类似的事情:

array[0]=`echo $a | sed -n 's/.*"id":."\(.*\)",.*/\1/p'`

顺便说一下,test是bash中的保留字,你应该避免将它用作文件名(不过与你的问题无关)。