• 締切済み

シェル変数に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 コマンドを引き数無しで使いなさい。

関連するQ&A

  • bシェルでシェル変数に変数に代入されている値の個数

    bシェル(Bourneシェル)で、シェル変数に変数に代入されている 値の個数を知りたいのですが、できるのでしょうか。 ----- #!/bin/sh A="1 2 3 4 5" echo $A 変数Aには、半角スペース区切りで、「1 2 3 4 5」と5個の値が 代入されています。 この設定されている値の個数、5を求めたいのですが、 どうすればよいのでしょうか。 Solaris8 Bシェル です。

  • 空白を含んだシェル変数の代入

    こんにちは。 空白を含んだシェル変数の代入について教えてください。 set test1="ABCD EFGHIJ" set w1=$test1 echo "w1 = $w1" このようなシェルスクリプトを実行させた時 w1 = ABCD と表示されてしまいます。 解決案があれば教えてください。 よろしくお願いします。

  • コマンドの結果を変数へ代入@シェルスクリプト

    Linux初心者です。 標記のとおり、シェルスクリプトで、コマンドの結果を変数へ代入することはできるでしょうか? 目的は、あるプログラムの開始時間から終了時間までの経過時間を計算して表示することです。時間を変数に代入しておいて計算したいのですが、方法がわかりません。(入出力のリダイレクト(|や>)、コマンドを引数に渡す方法(``)はわかったのですが...) よろしくお願いいたします。

  • シェル(ksh)で変数にある文字列を取り出す

    お世話になります。 シェルで変数(例えば:OUT)に入っている文字列ついて2つ質問させてください。 1:変数に入っている文字列を後ろから何文字(固定長)取り出したい場合にどのようすればよいか教えてください。 試してみたのは以下です。 OUT1=abcde #変数OUT1に文字列abcdeを代入 OUT=${OUT1:3:(-1)} (固定長3バイト後ろから取り出したい(cde)) をファイルに書きこんで起動すると、上記の処理にいったところで、"置換が正しくありません"とでてしまいます。 2:変数に入っている文字列の文字数を取り出したい。 試してみたのは以下です。 OUT1=abcdec #変数OUT1に文字列abcdeを代入 OUT=${#OUT} これは、コマンドラインでecho ${#OUT}とすると6と文字数を表示してくれますが、ファイルに書きこんで起動すると上記同様"置換が正しくありません"と表示されてしまいます。 OSは、SUN OS 5.8です。 わかるかたがいらっしゃたら教えてください。 宜しくお願いします。

  • 【シェルスクリプト】 ローカル変数、グローバル変数

    シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。

  • MySQLのデータをシェルの変数に入れる方法

    お世話になります。 ユーザ名とパスワードを入力させるフォームをPHPで作成し、 MySQLのSpoolに書き込むものを作りました。 やりたいことはシェルスクリプト(bash)を用いて、Spoolの データをシェルの変数に入れ、その変数を基にLinuxのユーザを 作成しようと思っています。 以下シェルスクリプトでMySQLのデータを表示することは出来たのですが、 echo 'use test;select * from spool'|mysql -u root -ppassword 表示したデータを変数に入れることが出来ません。 $test='use test;select * from spool'|mysql -u root -ppassword echo $test どのようにしたら上手くできるでしょうか? 皆様のテクニックを御教授下さい。 環境 OS-CentOS4.4 MySQL-4.1.20

  • シェルスクリプトで、変数が整数か否かの判断は?

    シェルスクリプトの中で、単純に 「変数が整数なのか」 を判断したいのです。 私が考えたのは、 echo 変数 | grep -c '[1-9][0-9]+' を使って、結果が0か否か調べるというものですが、もっと簡単に調べる方法はないのでしょうか。

  • シェルでのスペースを考慮した処理方法

    以下のようなシェルを実行しますと #! /bun/csh set A_CODE = `echo "   5555 " | awk -F\t {print $1}'` echo "$A_CODE" (5555の前後に複数のスペース文字有り) 結果--------------------------- 5555 ------------------------------- というようにスペースがなくなってしまいます。 なにか方法がありましたら教えてください。

  • applescriptで変数の代入について

    現在applescriptにて自動マウントのscript挑戦中です。 tell application "Finder" try mount volume "afp://●" delay 10 end try end tell のように作成したのですが、事前に変数aURLにアドレス文字列を設定して、その変数aURLを●に代入したいのですがget aURLとかset aURL等試しているのですがうまくいきません。 変数をどの様に呼び出すと良いのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Mac
  • シェルスクリプトのコマンド グループ化における変数の有効範囲について教

    シェルスクリプトのコマンド グループ化における変数の有効範囲について教えてください。 中括弧"{ }"を使うと親プロセス(=その実行中のプロセス)にて実行、 小括弧"( )"を使うとサブシェル(=子プロセス)にて実行されると認識しています。 また環境変数は子プロセスに引き継がれ、シェル変数は引き継がれないと認識しています。 以下のシェルスクリプト(Bシェル)でテストしたところ、続くような結果となりました。 ~スクリプト内容~ #!/bin/sh ##TEST1 VAR01=AAA { echo 中括弧内でVAR01は${VAR01}; } ( echo 小括弧内でVAR01は${VAR01}; ) ##TEST2 { VAR02=BBB; echo 中括弧内でVAR02は${VAR02}; } echo 外でVAR02は${VAR02} ##TEST3 ( VAR03=CCC; echo 小括弧内でVAR03は${VAR03}; ) echo 外でVAR03は${VAR03} ~実行結果~ 中括弧内でVAR01はAAA 小括弧内でVAR01はAAA 中括弧内でVAR02はBBB 外でVAR02はBBB 小括弧内でVAR03はCCC 外でVAR03は  VAR02、VAR03の結果は納得できます。 またVAR01が{ }に引き継がれているのも納得できました。 しかし、VAR01はシェル変数として作成した(exportによる環境変数化はしていない)にも関わらず、子プロセスである( )内処理にも引き継がれているのはなぜなのでしょうか?