shell脚本读取数组并将数组值解析为函数

时间:2014-08-08 00:51:08

标签: arrays shell

我有两个数组如下:

Array1 -  ( val1 val2 val3 val4 val5 )
Array2 -  ( user1 user2 user3 user4 user5 )

array1中的每个值都有一个函数。例如:Functionval1Functionval2Functionval3 ...

现在我需要一个shell脚本,它将读取array1并调用相应的函数,并将Array2的相应值传递给函数。

Ex:从val1读取Array1val1来电Functionval1并将user1传递给该函数。

你能帮助我建立逻辑吗?

此致 希瓦。

3 个答案:

答案 0 :(得分:1)

你可以遍历数组索引并分别调用每个函数及其参数。

Array1=( val1 val2 val3 val4 val5 )
Array2=( user1 user2 user3 user4 user5 )

for i in ${!Array1[@]}; do
    "Function${Array1[$i]}" "${Array2[$i]}"
done

考虑这样的测试脚本:

#!/bin/ksh
Functionval1 (){
    echo "this is a test $1"
}
Functionval2 (){
    echo "this is another test $1"
}

Array1=( val1 val2 )
Array2=( user1 user2 )
for i in ${!Array1[@]}; do
    "Function${Array1[$i]}" "${Array2[$i]}"
done

输出:

this is a test user1
this is another test user2

您也可以重写脚本来执行相同的操作,而不使用${!...[@]}语法。

Array1=(val1 val2)
Array2=(user1 user2)
arr_len=${#Array1[@]}
let arr_len--
for i in $(seq 0 $arr_len); do
    "Function${Array1[$i]}" "${Array2[$i]}"
done

请注意,您必须针对像zsh这样的shell调整此值,以便将其第一个数组元素编入索引1

答案 1 :(得分:0)

#!/bin/bash

# functions defined here, e.g Functionval1 etc.

#....

# Array declarations

declare -a Array1=( val1 val2 val3 val4 val5 )
declare -a Array2=( user1 user2 user3 user4 user5 )

# get length of Array1
array1length=${#Array1[@]}

for (( i=0; i<${#Array1[@]}; i++ ));
do
   function_to_run="Function${Array1[$i]}" # E.g. function_to_run becomes Functionval1
   function_parameter=${Array2[$i]} # E.g. function_parameter becomes user1
   $function_to_run $function_parameter # E.g. Functionval1 user1
done

您可以在不声明function_to_runfunction_parameter的情况下执行此操作,但在使用它时更容易理解。

答案 2 :(得分:0)

Korn Shell版本:

#!/bin/ksh

# functions defined here, e.g Functionval1 etc.

set -A Array1 val1 val2 val3 val4 val5
set -A Array2 user1 user2 user3 user4 user5

# get length of Array1
Array1length=${#Array1[@]}

i=0
while (( $i < $Array1length ))
do
   function_to_run="Function${Array1[$i]}"
   function_parameter=${Array2[$i]}
   $function_to_run $function_parameter
   i=$i+1
done