2015-04-23 114 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 

}