2013-06-21 10 views
17

これを1時間検索しても私が答えを見つけられないのは驚くべきことです。 私はこのような私のスクリプトに配列を渡すしたいと思います:配列引数をBashスクリプトに渡す方法

test.sh argument1 array argument2 

私は、次のような別のbashスクリプトでこれを入れたくない:

array=(a b c) 
for i in "${array[@]}" 
do 
    test.sh argument1 $i argument2 
done 
+0

http://stackoverflow.com/a/1063367/2235132 – devnull

答えて

17

バッシュ配列として子プロセスに配列変数をエクスポートしていないので、「ファーストクラス値」ではありません - あなたは1「もの」のようにそれらを周りに渡すことはできません。

test.sh argument1 ${array[*]} argument2 

あなたは、配列を読むことができます:test.shはbashスクリプトで、私は

#!/bin/bash 
arg1=$1; shift 
array=("[email protected]") 
last_idx=$((${#array[@]} - 1)) 
arg2=${array[$last_idx]} 
unset array[$last_idx] 

echo "arg1=$arg1" 
echo "arg2=$arg2" 
echo "array contains:" 
printf "%s\n" "${array[@]}" 

を行うと、これはあなたのコマンドである場合

test.sh argument1 "${array[@]}" argument2 
+0

偉大な答え。私はこれが 'test.sh argument1 array argument2'のOPの要件に適合していないが、' test.sh argument1 argument2 array'(配列が最後のもの)に変更された場合、それほどうまくいかないことを知っています。 – doubleDown

+2

良い答え。しかし、技術的には配列をスクリプトに渡すことはありません。OPが 'test.sh argument1 array1 array2'のように2つの配列変数をこのスクリプトに渡す必要がある場合はどうでしょうか? – anubhava

9

スクリプトこのようなarrArg.shを持っている:

#!/bin/bash 

arg1="$1" 
arg2=("${!2}") 
arg3="$3" 
arg4=("${!4}") 

echo "arg1=$arg1" 
echo "arg2 array=${arg2[@]}" 
echo "arg2 #elem=${#arg2[@]}" 
echo "arg3=$arg3" 
echo "arg4 array=${arg4[@]}" 
echo "arg4 #elem=${#arg4[@]}" 

今のセットアップシェルでこのようなあなたの配列:

arr=(ab 'x y' 123) 
arr2=(a1 'a a' bb cc 'it is one') 

そして、このような引数を渡す:

. ./arrArg.sh "foo" "arr[@]" "bar" "arr2[@]" 

スクリプトの上には印刷されます:

arg1=foo 
arg2 array=ab x y 123 
arg2 #elem=3 
arg3=bar 
arg4 array=a1 a a bb cc it is one 
arg4 #elem=5 

注:私が. ./script構文を使用してスクリプトを実行していますという変な表示される場合があります。これは、現在のシェル環境ののスクリプトのコマンドを実行するためのものです。

Q.なぜ現在のシェル環境、なぜサブシェルではないのですか?
A. bashはdocumented here by bash author himself

+5

配列要素に空白が含まれている場合はどうなりますか? –

+1

これは貧しい人のアプローチです。 – devnull

+0

@glennjackman:私のアプローチを変更しました。pls check now。 – anubhava

-3

ようにそれを呼び出しますと仮定

test.shに次のように入力します。

arg1=$1 
arg2=${2[*]} 
arg3=$3 

あなたに文句を言いますが(「悪い置換」)、動作します。

関連する問題