【问题标题】:Multiply elements of array in bash在bash中将数组元素相乘
【发布时间】:2015-11-01 14:38:55
【问题描述】:

我有两个数组

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

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

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

现在我明白了,

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

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

谁能给我指路?

如果我想在得到数组 days 的第二个元素时求和 24 的值,如果我得到数组 days 的第一个元素的值则为零...我使用了以下代码但没有成功。 .

#!/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 只是一个空格分隔的字符串。
  • 更糟糕的是,value 只是(逐字)字符串{00..23}

标签: bash bc


【解决方案1】:

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

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

【讨论】:

  • 感谢 cmets。 @gniourf_gniourf 我还有一个疑问,我在上面的问题中解释了它
  • @EnricAgudPique:帖子已编辑以回答您的问题……
猜你喜欢
  • 2021-08-31
  • 2019-02-28
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2013-11-08
  • 2020-07-10
  • 1970-01-01
相关资源
最近更新 更多