2015-11-01 64 views
1

我有兩個數組乘元素

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..but我不明白這一點....

+0

你有一個數組; 'value'只是一個空格分隔的字符串。 – chepner

+1

更糟的是,'value'只是(逐字)字符串'{00..23}'。 –

回答

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 

是錯誤的:你需要周圍的=號(否則只能猛砸測試是否通過得到的線空間擴展"$day"="${days[0]}"不是空的......並且這個字符串從不爲空! - 這是因爲Bash只看到一個 argum在[[...]]之間)。而不是這樣寫:

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 
+0

感謝您的意見。 @gniourf_gniourf我有另一個疑問,我解釋我的問題上面 –

+0

@EnricAgudPique:張貼編輯回答你的問題... –

+0

這是我需要@gniourf_gniourf,謝謝 –