web-dev-qa-db-ja.com

配列引数をBashスクリプトに渡す方法

これを1時間検索しても答えが見つからないのは驚きです。次のように配列をスクリプトに渡したいと思います。

test.sh argument1 array argument2

これを次のような別のbashスクリプトに入れたくありません。

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

Bash配列は「ファーストクラスの値」ではありません。1つの「もの」のように渡すことはできません。

test.shはbashスクリプトです。

#!/bin/bash
arg1=$1; shift
array=( "$@" )
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
29
glenn jackman

スクリプト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は配列変数を子プロセスに bash作成者自身がここに文書化 としてエクスポートしないため

14
anubhava

配列をファイルに書き込んでから、スクリプト内でファイルを取得できます。例えば。:

array.sh

array=(a b c)

test.sh

source $2
...

Test.shスクリプトを実行します。

./test.sh argument1 array.sh argument3
0
Dd H