PHP

シェルスクリプトで変数に入った引数付きのPHPコマンドを実行する

シェルから PHP クライアントでコマンド実行。

よくあるケースですが、コマンドと引数の展開でハマったので備忘録に。

例えば上記のようなベタなコマンドだったら、どちらの引数も a と b が受け取れます。

では、こんなケースはどうでしょうか。

CMD1 の結果は冒頭のものと同様ですが、CMD2 の結果は以下のようになります。

a にはダブルクォーテーションが、b にはシングルクォーテーションが付いてしまっていますね。

“a”
‘b’

今回はこの問題に対応していきます。

PHPのコマンド生成

上ではシンプルな例を書きましたが、実際には csv ファイルの各列を引数に持たせて一部の項目だけシングルクォーテーションで囲みたいのですよね。

以下を「test.csv」とします。

こんなシェルをイメージしてみてもらえますか。

結果は以下のようになります。

このコマンドをターミナルで実行すれば問題なく処理されます。

php index.php a b ‘c’
php index.php d e ‘f’
php index.php g h ‘i’

PHPコマンドが意図通りに動かないケース

しかし、この CMD1 の変数をそのまま実行すると意図通りには動作しません。

冒頭の実行結果を見てもらうとわかりますが、シングルクォーテーションで囲んでいる部分の展開がうまくいっていません。

そこで eval の登場です。

$(eval echo “${CMD1}”)

先に「echo “${CMD1}”」を評価させてから実行させてしまえば問題ないですね。

もちろん、引数にダブルクォーテーションやシングルクォーテーションがなければ、ここでハマることはありません。

こうやって気付ける機会があるのがいいのか悪いのか・・・。

まとめ

シェルで PHP の引数付きコマンド(シングルクォーテーション付き)を実行する方法を紹介してきました。

引数の文字列に、エスケープが必要な記号や半角スペースなどが入ってくる可能性を考えるとシングルクォーテーションで囲んでおきたいですよね。

シェルのコマンドや変数の展開について理解しておかないと、今回のようにハマることになるので復習したいと思います。