不是很困難:
#!/bin/bash
hr=(00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23)
for i in ${hr[@]}; do
echo ${hr[i]}
done
但:
user@userver:$ ./stat.sh
00
01
02
03
04
05
06
07
./stat.sh: string 7: 08: value too great for base (error token is "08")
Bash 認為前導零表示八進制數制。該怎么辦?
uj5u.com熱心網友回復:
我認為你的根本問題是你使用陣列的每個元素來索引陣列本身。
如果你只想列印出陣列元素,你應該輸出${i}而不是${hr[i]}. 后者在您當前的代碼中是無用的,因為元素 0 是00,元素 1 是01,依此類推。
如果這是一個簡化的示例,并且您確實希望根據此陣列的內容參考不同的陣列,則有以下幾種選擇:
- 意識到整數的值和它的表示是兩件不同的事情。換句話說,使用
0, 1, 2, ...但printf "d" $i如果你需要輸出它(注意這只是輸出第一個陣列中的值,而不是你正在查找的值)。 - 專門使用字串和基于字串的關聯陣列而不是基于整數的關聯陣列,請參閱
typeset -A詳細資訊。
uj5u.com熱心網友回復:
使用大括號擴展(范圍、重復)。
創建陣列:
hours=({00..23})
回圈遍歷它:
for i in "${hours[@]}"; do
echo "$i"
done
或者回圈通過大括號擴展:
for i in {00..23}; do
echo "$i"
done
關于您的錯誤,這是因為在 bash 算術中,所有帶前導零的數字都被視為八進制數,而 08 和 09 是無效的八進制數。所有索引陣列下標都作為算術運算式求值。您可以通過使用表示法base#number指定數字系統來解決該問題。所以對于基數 10: 10#09,或對于i=09, 10#$i。變數必須以$,為前綴10#i不起作用。
無論如何,您應該像這樣列印陣列:
回圈遍歷元素:
for i in "${hr[@]}"; do
echo "$i"
done
回圈索引:
for i in "${!hr[@]}"; do
echo "index is $i"
echo "element is ${hr[i]}"
done
如果您需要對小時數或任何零填充數字進行算術運算,您將丟失零填充。您可以使用 printf: 再次列印它printf %.2d "$num",其中2是最小寬度。
uj5u.com熱心網友回復:
當您迭代時:
for i in ${hr[@]}; do
它正在迭代陣列女巫的值是:
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
但是當在回圈中時它有:
echo ${hr[i]}
它i用作hr陣列的索引。
在 Bash 中,陣列括號內的索引[i]是算術背景關系。這意味著雖然算術背景關系中i=08的前導值0導致數字被視為八進制數,并且8是無效的八進制數。
如果你想迭代你的陣列索引以按索引處理它的值,那么你可以這樣開始回圈:
for i in "${!hr[@]}"; do
這個將完美地作業,因為它將索引迭代到變數中i:
#!/usr/bin/env bash
declare -a hr=(00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23)
for i in "${!hr[@]}"; do
printf '%s\n' "${hr[i]}"
done
現在,如果你想要的只是迭代hr陣列的值,只需這樣做:
#!/usr/bin/env bash
declare -a hr=(00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23)
for e in "${hr[@]}"; do
printf '%s\n' "$e"
done
無需在回圈內索引陣列,因為元素已經擴展為e.
uj5u.com熱心網友回復:
您可以指定它是基于 10 的:
echo ${hr[10#$i]}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/351561.html
