TopProgramming Languagebash > 2013年9月
2013年9月13日

bashで引数に配列を設定する方法

September 13,2013 2:55 AM
Tag:[]
Permalink

bashで引数に配列を設定する方法を紹介します。

bashで引数に配列を設定する方法

1.問題点

bashでは配列を引数として渡すことができません。

たとえば、次のように配列を関数fooのパラメータに渡すことはできません。

function foo() {
    local list=$1
    for i in "${list[@]}"; do
        echo "${i}"
    done
}
 
hoge=( 'xxx' 'yyy' 'zzz' )
foo ${hoge[@]}

2.引数に配列を設定する

配列を設定することはできないので、配列の名前を引数で渡し、関数側では間接参照を使います。

function foo() {
    local arrayname=$1
    eval ref=\"\${$arrayname[@]}\"
    local list=( ${ref} )
    for i in "${list}"; do
        echo "${i}"
    done
}
 
hoge=( 'xxx' 'yyy' 'zzz' )
foo hoge

まず、関数起動のときには配列の名前だけを渡します。

foo list

呼び出された関数fooでは、配列の名前を変数に保持します。

local arrayname=$1

evalを用いて、変数に保持した値を変数名として、さらにその値を取得します。

eval ref=\"\${$arrayname[@]}\"

上記のコードは、evalで変数部分($arrayname)が評価されて、

ref="${hoge[@]}"

となります。

これで変数refに「xxx yyy zzz」という値が設定されるので、これを関数側の配列として定義します。

local list=( ${ref} )

ワンクッションかツークッション、処理が多いような気もするので、よりエレガントな方法がありましたらどこかでつぶやいてください。

Comments [0] | Trackbacks [0]
2013年9月11日

bashで変数の値を変数名にする方法

September 11,2013 12:55 AM
Tag:[, ]
Permalink

bashで変数の値を変数名にする方法を紹介します。

bashで変数の値を変数名にする

1.bashの間接参照を利用する

bashでは「!」を使って間接参照することで、変数の値を変数名として利用することができます。

#!/bin/sh
 
foo=hoge
bar=foo
echo ${!bar}

これを実行すれば

hoge

と出力されます。

ただしFreeBSDやSolarisではこのテクニックは使えないようです。

よって、プログラムを他のOSに移植する可能性がある場合は次項のテクニックを使った方がよいでしょう。

2.evalを使った間接参照を利用する

evalは変数を評価した後、引数の文字列をコマンドとして実行する機能があります。

evalを利用した間接参照で、変数の値を変数名として利用することができます。

#!/bin/sh
 
foo=hoge
bar=foo
eval echo \"\$$bar\"

これを実行すれば

hoge

と出力されます。

上記のサンプルでは、

eval echo \"\$$bar\"

がevalによって変数部分の「$bar」だけが評価されて

echo "$foo"

となり、これをコマンドとして実行します。

次のような形式でも動作しますが、変数の値が解釈されないよう、サンプルのように評価後に全体がダブルクォーテーションで括られるようにしておいた方が安全でしょう。

eval echo '$'"$bar"
eval echo \${$bar}

3.値を変数に代入する

2項の方法で標準出力に出力せずに変数に代入するには次のようにします。

#!/bin/sh
 
foo=hoge
bar=foo
eval test=\"\$$bar\"

上記のサンプルでは、

eval test=\"\$$bar\"

がevalによって変数部分の「$bar」だけが評価されて

test="$foo"

となり、これをコマンドとして実行し、変数testに値「hoge」が代入されます。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3