簡體   English   中英

復制變量的值,而不是引用bash腳本

[英]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在算術上下文中求值,其中foobarfoobar遞歸擴展,直到獲得整數值為止。未定義的變量擴展為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
}

鑒於ipackages中每個元素的索引相同,您還可以編寫

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循環是連續的。

而且我注意到您正在使用達爾文。 請記住,您確實需要它,可以使用HomebrewMacPorts安裝bash 4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM