空白混じりの引数を受け取る、bash script の書き方。先日までは引数の「渡し方」を書いてたけど、今回は空白混じりの引数を「渡される側」について。
- see also. clmemo@aka: dir path を bash 変数に入れて、dir alias にしている
- see also. clmemo@aka: 空白を含む path を bash 変数にして cd する
例えば 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