2015-04-23 122 views
0

我試圖做一個函數swap()這樣的參數作爲參考?

swap(){ 
#swap $1 and $2 here 
} 

我想交換是一個數組,讓我們說我們有

array[0]=12 
array[1]=45 
array[2]=99 

swap $array[0] $array[1] 

所以我想交換陣列[0]所以交換功能後,它變成45,數組[1]變成12。我正在考慮通過引用$ array [0](例如c中的指針)和$ array [1]來做這個交換,以便它可以改變。 我發現命令eval和upvar,但認真,我不明白的事情。我對這個shell腳本非常新,大部分文檔都讓我困惑不已。

+0

您正在使用什麼殼呢? – chepner

+0

如果我沒弄錯..嗯..當我使用echo $ SHELL它變成/ bin/bash ..當我做了ps -p $$時,它是PID 2627 TTY pts/0 TIME 00:00:00 CMD bash ..而我的bash版本是4.2版本 –

回答

0

bash數組有點棘手。你可以做的最清晰的事情是編寫函數,參數三個參數,數組名和兩個索引交換。這也要求你把array作爲一個全局變量;您只能在bash中將整個數組作爲單個對象傳遞。

(這確實需要bash 4或更高,其中引入的-g標誌declare。)

swap() { 
    local name=$1 
    local a=$2 
    local b=$3 

    local aname=$name[$a] 
    local bname=$name[$b] 
    local tmp=${!aname} # e.g. tmp=${array[$a]} 
    declare -g "${aname}=${!bname}" # e.g. array[$a]=${array[$b]} 
    declare -g "${bname}=$tmp"  # e.g. array[$b]=$tmp 
} 

bash 4.3介紹namerefs (declare -n)其中通過讓您聲明充當一個別名的本地陣列大大簡化此爲全球陣列。

swap() { 
    declare -n arr=$1 
    local a=$2 b=$3 
    local tmp=${arr[$a]} 
    arr[$a]=${arr[$b]} 
    arr[$b]=$tmp 

}