bash 中的数组元素相乘

Multiply elements of array in bash

我有两个数组

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..但我不明白....

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

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]}"是否不为空...而且这个字符串永远不会为空!—那是因为 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