在bash中乘以数组的元素

时间:2015-11-01 14:38:56

标签: bash bc

我有两个数组

value={00..23}
i=(01 02)

当我使用以下命令将它们相乘时,我得到结果,但我需要另一种格式......我需要结果为

00, 01...18, ...36

现在我明白了,

0,1 ..8, 18,..36

t=$(expr $value*$i | bc)

任何人都可以给我指路吗?

并且当我得到数组的第二个元素时,如果我想得到24的值,那么如果我得到数组的第一个元素的数值为零...我使用了以下代码但没有成功..

#!/bin/bash

data=`date +%Y-%m-%d`
data1=`date -d "1 day" +%Y-%m-%d`

days=("$data" "$data1")
for day in "${days[@]}"; do
for value in {00..23}; do
# here I order to sum up 00 if I get the first day, and if I get the second day, I order to sum up 24 at value...
if [[ "$day"="${days[0]}" ]]; then i=00
else
i=24
fi
t=$((10#$i+10#$value))
echo $t
done
done

我应该得到00,01,02 ...... 23,24,25,26 ...... 48 ..但我不明白......

1 个答案:

答案 0 :(得分:3)

你的问题不是很清楚。我猜你是在这种情况下:

value=( {00..23} ) # <--- this defines an array, unlike your code in the question
i=( 01 02 )

并且您希望循环遍历数组valuei并将这些术语相乘。您不需要exprbc,因为您只处理整数。唯一的问题就是你有一个领先的0;所以我们必须特别注意告诉Bash我们真的是指基数为10(而不是基数为8)的数字,使用基数说明符10#。另外,我们使用printf处理您的格式问题:

for a in "${i[@]}"; do
    for b in "${value[@]}"; do
        printf '%02d\n' "$((10#$a*10#$b))"
    done
done

这将打印到标准输出以下内容:

00
01
02
03
04
[...]
22
23
00
02
04
06
[...]
44
46

如果您想从中创建一个新阵列,请按以下步骤操作:

newarray=()
for a in "${i[@]}"; do
    for b in "${value[@]}"; do
        printf -v fab '%02d' "$((10#$a*10#$b))"
        newarray+=( "$fab" )
    done
done

然后,

declare -p newarray

将显示:

declare -a newarray='([0]="00" [1]="01" [2]="02" [3]="03" [4]="04" [5]="05" [6]="06" [7]="07" [8]="08" [9]="09" [10]="10" [11]="11" [12]="12" [13]="13" [14]="14" [15]="15" [16]="16" [17]="17" [18]="18" [19]="19" [20]="20" [21]="21" [22]="22" [23]="23" [24]="00" [25]="02" [26]="04" [27]="06" [28]="08" [29]="10" [30]="12" [31]="14" [32]="16" [33]="18" [34]="20" [35]="22" [36]="24" [37]="26" [38]="28" [39]="30" [40]="32" [41]="34" [42]="36" [43]="38" [44]="40" [45]="42" [46]="44" [47]="46")'

关于你的编辑:行

if [[ "$day"="${days[0]}" ]]; then i=00

错误:你需要=符号周围的空格(否则Bash只测试扩展"$day"="${days[0]}"获得的字符串是否为空...这个字符串永远不会是空的! - &#39;因为Bash只看到[[...]]之间的一个参数。写下这个:

if [[ "$day" = "${days[0]}" ]]; then i=00

现在,实际上,如果没有硬编码的24,您的脚本会更清晰(更短,更高效),并且对于循环的每次迭代都没有此测试:

#!/bin/bash

data=$(date +%Y-%m-%d)
data1=$(date -d "1 day" +%Y-%m-%d)

days=( "$data" "$data1" )
values=( {00..23} )

for day in "${days[@]}"; do
   for value in "${values[@]}"; do
      t=$((10#$i+10#$value))
      echo "$t"
   done
   ((i+=${#values[@]}))
done