シェルスクリプトでスペースがある変数をコマンドに渡して実行する

 GoogleMapsのマイプレイスを書き出したkmlファイルをgpsbabelでマージして一つのgpxファイルにしようとした。inputファイルはそれぞれ前に-fを付けなければならないようだ。そこでシェルスクリプト化。

#!/usr/bin/zsh
inputs=""
for I; do
	inputs="${inputs} -f \"${I}\" "
done
gpsbabel -i kml $inputs -o gpx -F tmp.gpx

 実行してみた。

 あかんやん。

 出来上がったコマンドラインを確認。

#!/usr/bin/zsh
inputs=""
for I; do
	inputs="${inputs} -f \"${I}\" "
done
echo gpsbabel -i kml $inputs -o gpx -F tmp.gpx

 想定通りのコマンドラインが形成されとるし、そのコマンドラインをコピー&ペーストして実行するとちゃんと動く。なんでや。なんかシェルスクリプトのお作法があるんか?

 「シェル 変数 実行」で検索してみた。
qiita.com

 ほう、実行させるコマンドにスペースがあるとうまく行かないのでevalで実行すると。

#!/usr/bin/zsh
inputs=""
for I; do
	inputs="${inputs} -f ${I} "
done
eval "gpsbabel -i kml $inputs -o gpx -F tmp.gpx"

 できた。成功したときにはなにもメッセージを残さないのでスクリーンショット省略。

 set -xは実行時に内容を表示するオプションとな。最初のスクリプトの最初にset -xを加えて実行してみた。

 シングルクォテーション付きで渡されてたってことか。でもなぜ文字化けするん?