[英]bash script copy output from set -x to file, called from within script rather than using tee
[英]copy the value of the variable rather than reference bash script
我對bash腳本有點陌生。 所以,請忍受我。 我試圖創建一個表,並在for循環中分配值,如下所示:
packages=("foo" "bar" "foobar")
packageMap=()
function test() {
i=0;
for package in "${packages[@]}"
do
echo $i
packageMap[$package]=$i
i=$(expr $i + 1)
done
}
test
echo the first value is ${packageMap["foo"]}
輸出為:
0
1
2
the first value is 2
雖然我的預期輸出是:
0
1
2
the first value is 0
因此,基本上將變量的引用分配給該變量而不是值。 如何解決呢?
我的bash版本:
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
TIA
bash
3.2僅具有索引數組,因此,如果$package
是整數而不是任意字符串,則packageMap[$package]
僅packageMap[$package]
預期工作。
(您觀察到的是$package
在算術上下文中求值,其中foo
, bar
和foobar
遞歸擴展,直到獲得整數值為止。未定義的變量擴展為0,所以packageMap[foo]
等同於packageMap[0]
。)
如果您使用的是bash
4或更高版本,則可以使用關聯數組:
packages=("foo" "bar" "foobar")
declare -A packageMap
test () {
i=0
for package in "${packages[@]}"
do
echo $i
packageMap[$package]=$i
i=$(($i + 1))
done
}
鑒於i
與packages
中每個元素的索引相同,您還可以編寫
test () {
for i in "${!packages[@]}"; do
package=${packages[i]}
packageMap[$package]=$i
done
}
而不是顯式增加i
。
正如chep所說,bash 3中沒有關聯數組。也就是說,如果您不介意浪費一點CPU,則可以使用函數來達到類似的效果:
#!/bin/bash
packages=("foo" "bar" "foobar")
function packagemap () {
local i
for i in "${!packages[@]}"; do
[[ ${packages[$i]} = $1 ]] && echo "$i" && return
done
echo "unknown"
}
echo "the first value is $(packagemap "foo")"
${!array[@]}
構造擴展為數組的索引集,對於通常不相關的數組,該數組由從0開始的遞增整數組成。但是可以刪除數組成員而無需重新編號索引(即未unset packages[1]
索引) unset packages[1]
),因此重要的是能夠引用實際索引,而不是假設它們與簡單計數的for循環是連續的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.