• 締切済み

シェル変数に2つのスペースを代入する方法

シェルスクリプトを作成する際、変数に2つのスペースを持つ値を代入するにはどうすればいいのでしょうか。 例えば変数SPACEに「Jan△△1」という文字列を代入したい(△はスペース1文字分)時、 SPACE="Jan△△1" echo $SPACE   としても、 結果は「Jan△1」となってしまいます。 どなたかご存じの方、よろしくお願いします

みんなの回答

  • qaaq
  • ベストアンサー率36% (146/404)
回答No.2

>悪意ある人がシェル変数 $SPACE に「foo | rm -rf /」と言う値をセット・・・ 誤:foo | rm -rf / 正:foo | `rm -rf /` ですね。 # rm じゃなくて ls あたりでためしてね。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

定義は正しく行われているが、表示方法が間違っている。 シェルで echo $SPACE と打つと、まず、シェルが$SPACEを展開する。 つまり、内部的に echo Jan△△1 になり、echoコマンドに送られる。 echoコマンドは引数に Jan△△1 が渡されて来ると、引き数が2つあると解釈する。「”」で括られて居ないので当然の動作である。 よって、echoは Jan 1 の2つの引き数を1文字の空白で区切ってコンソールに出力する。 結果、画面には Jan△1 と出力される。 echo Jan△△1 echo "Jan△△1" echo $SPACE echo "$SPACE" echo \"$SPACE\" の5つのコマンドを試して、それぞれがどういう結果をコンソールに出すか試せば判る。 ここで1つ忠告。 悪意ある人がシェル変数 $SPACE に「foo | rm -rf /」と言う値をセットしていた時、 echo $SPACE と言うコマンドを叩いたらどうなるであろうか? 当然、 echo foo | rm -rf / が実行される訳だが、その結果についての責任は、コマンドを叩いた人間が負う事になる。 悪い事は言わないから、シェル変数の内容確認にechoコマンドを使うのは、今すぐ禁止し、代わりに set コマンドを引き数無しで使いなさい。