2014-12-08

空白を含む引数を bash script に渡す

空白混じりの引数を受け取る、bash script の書き方。先日までは引数の「渡し方」を書いてたけど、今回は空白混じりの引数を「渡される側」について。

例えば bash script が 2 つあったとする: a.sh と b.sh

a.sh は b.sh を呼び出す。

#! /bin/bash

token=foo
name="Ludwig van Beethoven"

bash b.sh $taken $name

b.sh は引数を受け取って処理を行なう。例えば、こんなコード

#! /bin/bash

option='-foo -bar'
token=$1
name=$2

some-command $option $token $name

この時、変数 name には二番目の引数が入る。a.sh で渡す「二番目」の引数は "Ludvig van Beethoven" なので、変数 name にもその値が入っていることを期待したくなるけど、実は "Ludvig" という値しか入っていない。引数 "Ludvig van Beethoven" は空白で分割されて 3 つの引数になってしまう。

今回の b.sh の例だと、$3, $4 に "van" と "Beethoven" が入る。

これは嬉しいくない。そこで、変数 $* を使う。すると、空白を含む引数をひと固まりに扱うことができる。引数が 2 つある (今回の様な) 場合なら、shift を使うとスマートにコードが書ける。

#! /bin/bash

option='-foo -bar'
token=$1
shift
name=$*

some-command $option $token "$name"

some-command に渡す引数は一応 "" で囲んでおく方が安全。

あとがき

shell は「空白」を引数の区切りにするので、ハマりやすい。というか、実際にハマりまくったので、メモとして残しておく。

No comments:

Post a Comment