[0] -bash:[:0 * 1%8:预期的整数表达式

时间:2014-11-05 02:04:35

标签: bash

有人可以指出输出有什么问题。

for i in {0..127} ; do 
    echo -n [$i]
    if [ $i*$j%8 -eq 0 ]; then 
        echo "\n"
    fi
    mytool -c "read 0x1540:0xa0:$i*$j"
done

我正在尝试将输出格式化为每行包含8个项目的行。

我尝试了下面的建议并将我的代码修改为

for i in {0..8} ; for j in {0..16}; do 
    echo -n [$i*$j]
    if [[ $i*$j%8 == 0 ]]; then 
        echo
    fi
    mytool -c "read 0x1540:0xa0:$i*$j"
done

上面有for i in {0..8} ; for j in {0..16}

我希望这是一个嵌套的for循环。我不确定这是否是我在bash中执行嵌套循环的方式。

输出仍然不如我所料。

我的输出看起来像

[0]0x3
[1]0x4
[2]0x21
[3]0x1
[4]0x0
[5]0x0
[6]0x4
[7]0x41
[8]0x84
[9]0x80
[10]0x0
[11]0x0
[12]0x3
[13]0x0
[14]0x43
[15]0x49
[16]0x53
[17]0x43
[18]0x4f
[19]0x2d
[20]0x49
[21]0x4e
[22]0x43
[23]0x20
[24]0x0
[25]0x0
[26]0x9
[27]0x3a
[28]0x37
[29]0x34
[30]0x39
[31]0x34

我想在ROW1中使用[0]到[7]        ROW2中的[8]至[15]

等等。

2 个答案:

答案 0 :(得分:0)

如果你想做数学,请使用(( ))

if ((i * j % 8 == 0)); then

鉴于你的问题描述,我建议稍微改写一下。

for i in {0..15}; do
    for j in {0..7}; do
        echo -n "[$((i * 8 + j))]"
        mytool -c "read 0x1540:0xa0:$i*$j"
    done

    echo
done

答案 1 :(得分:0)

test命令([test的别名,而不是语法)需要从多个参数构建表达式。这意味着空间对于分离运算符和操作数至关重要。由于每个部分都是一个单独的参数,因此您还需要引用*,以便在调用test / [之前shell不会将其扩展为文件glob。

    if [ "$i" "*" "$j" % 8 -eq 0 ]; then

test命令需要7个单独的参数:$i*$j%-eq和{{1然后,它组装成一个要评估的表达式。它不会将任意字符串解析为表达式。

如John Kugelman所述,在0中有更简单的方法来完成此类算术。