我想在一個回圈中創建一個 Bash 字典,然后將它添加到一個陣列中:
#!/usr/bin/env bash
periods=()
for arg
do
echo "arg: $arg"
day= month= year=
case $arg in
*/*/* | *-*-*)
read -r year month day < <(date ' %Y %m %d' -d "$arg")
;;
????[-/]?? | ????[-/]?)
IFS='-/' read -r year month <<< "$arg"
;;
??[-/]???? | ?[-/]????)
IFS='-/' read -r month year <<< "$arg"
;;
esac
declare -A period
period[year]=$year
period[month]=$month
period[day]=$day
periods =(period)
done
# display
for period in "${!periods[@]}"
do
echo "year: ${period[year]} / month: ${period[month]} / day: ${period[day]}"
done
不幸的是,似乎每個period實體periods都是對最后添加的值的參考:
$ ./parse.sh 3/14/19 3/14/2020
arg: 3/14/19
arg: 3/14/2020
year: 2020 / month: 03 / day: 14
year: 2020 / month: 03 / day: 14
有沒有辦法定義一個 Bash 變數,使每個實體都是唯一的?
uj5u.com熱心網友回復:
bash 沒有資料結構來支持二維陣列或關聯陣列串列,正如您在此代碼中嘗試的那樣,但是您可以在 bash 代碼中使用二維陣列的這種模擬:
CODE DEMO
#!/usr/bin/env bash
declare -A periods
rec=0
for arg; do
echo "arg: $arg"
day= month= year=
case $arg in
*/*/* | *-*-*)
read -r year month day < <(date ' %Y %m %d' -d "$arg")
;;
????[-/]?? | ????[-/]?)
IFS='-/' read -r year month <<< "$arg"
;;
??[-/]???? | ?[-/]????)
IFS='-/' read -r month year <<< "$arg"
;;
esac
periods[$rec,year]="$year"
periods[$rec,month]="$month"
periods[$rec,day]="$day"
((rec ))
done
# check periods array content
declare -p periods
# display values from associative array
for ((i=0; i<rec; i )); do
echo "year: ${periods[$i,year]} / month: ${periods[$i,month]} / day: ${periods[$i,day]}"
done
輸出:
arg: 3/14/19
arg: 3/14/2020
declare -A periods=([0,year]="2019" [1,day]="14" [0,month]="03" [0,day]="14" [1,year]="2020" [1,month]="03" )
year: 2019 / month: 03 / day: 14
year: 2020 / month: 03 / day: 14
uj5u.com熱心網友回復:
根據您想要獲得的 hacky 程度,您可以“欺騙” Bash 以支持關聯陣列的陣列,盡管此時我會開始考慮我想用其他語言撰寫此腳本;)
其要點是您基本上將關聯陣列的結構保存為陣列中的字串,declare通過函式將seval相互隔離,然后在您準備好時將每個關聯陣列回傳到真正的 bash 資料結構從中閱讀。
此方法對于將關聯陣列“傳遞”給函式也很有用。
#!/usr/bin/env bash
periods=()
function main {
for arg
do
echo "arg: $arg"
day= month= year=
case $arg in
*/*/* | *-*-*)
read -r year month day < <(date ' %Y %m %d' -d "$arg")
;;
????[-/]?? | ????[-/]?)
IFS='-/' read -r year month <<< "$arg"
;;
??[-/]???? | ?[-/]????)
IFS='-/' read -r month year <<< "$arg"
;;
esac
declare -A period
period[year]="${year}"
period[month]="${month}"
period[day]="${day}"
save_to_array "period"
done
}
function save_to_array {
var=$(declare -p "$1")
periods =("${var}")
}
main "$@"
# display
for _per in "${periods[@]}" # note the lack of ! expansion
do
eval "declare -A final="${_per#*=} # new associative array `final` gets declared here
echo "year: ${final[year]} / month: ${final[month]} / day: ${final[day]}"
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372717.html
標籤:猛击
