アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記2コマンドでセミコロンを付ける場合と付けない場合どのような違いがあるのでしょうか?また、2つ目のコマンドはどのような法則に基づいて、シェル変数の設定部分と、実行するコマンドの部分が切り分けて解釈されたのでしょうか?

よろしくお願いいたします。

$ VERSION=2; echo ${VERSION}
2
$ VERSION=2 echo ${VERSION}
2
$ echo aaa echo bbb
aaa echo bbb

A 回答 (3件)

bash等のB-sh系シェルでは


変数定義 コマンド ...
とすることで、一時的に「環境変数を定義」して「コマンド」を実行します。

VERSION=2; echo ${VERSION}
は、
VERSION=2
echo ${VERSION
という2つのコマンドを順次実行するものです。
現在実行しているシェルで変数VERSIONに2が設定されます。

VERSION=2 echo ${VERSION}
は、一時的にVERSION=2を設定して、echo ${VERSION}を実行する、という1つのコマンドです。
これを
VERSION=5 echo ${VERSION}
などとしても、現行シェルのVERSIONは元のままです。

ただ、この場合、やはり出力は「2」になります。それは、このコマンドラインの実行の流れとして、まず${VERSION}が展開され「VERSION=5 echo 2」が実行されるからです。

確認するには,echoversion.shとして
echo ${VERSION}
とだけ書いたファイルを用意し、chmod +x echoversion.sh をした上で
VERSION=2; ./echoversion.sh
echo ${VERSION}
VERSION=5 ./echoversion.sh
echo ${VERSION}
を比べればわかると思います
    • good
    • 0
この回答へのお礼

ありがとうございました。解説いただいたおかげできちんと理解できました。

私はプログラムのビルドでこのように書かれたスクリプトを見てずっと気になっていました。ちゃんとした法則があることがわかり、また一歩前進できました。

お礼日時:2013/01/02 23:14

セミコロンがある文はパイプラインをシーケンシャルに実行


平たく言えば複数のコマンドを数珠つなぎに連続して処理すること

スペース区切りの文は文字列を引数として渡してコマンドechoを呼び出しています

関連項目

bashスクリプトのセミコロンは,改行と同義なんでしょうか. 手.. - 人力検索はてな http://q.hatena.ne.jp/1209009497

Man page of BASH
http://linuxjm.sourceforge.jp/html/GNU_bash/man1 …
    • good
    • 0
この回答へのお礼

bashのマニュアルをちゃんと読んだことがありませんでした。印刷して読んでみようと思います。ありがとうございます。

お礼日時:2013/01/02 23:17

セミコロンは、命令の区切りなので、


>$ VERSION=2; echo ${VERSION}
は、
$ VERSION=2
$ echo ${VERSION}
と同じです。1つめがシェル変数への値の代入で、2つめがそのシェル変数の値の表示。

>$ VERSION=2 echo ${VERSION}

これは、環境変数へ値を設定した状態で、echo を呼び出します。ただ、echoの呼び出し前に ${VERSION} の部分の展開がなされるので、

$ VERSION=1
$ VERSION=2 echo ${VERSION}
では、1が表示されます。

環境変数の一時的な置き換えができるので、普通はechoのようなbash組み込みコマンドでなくて、外部コマンドの実行環境を変えるときに使います。
たとえば、
$ man ls ⇒ 日本語のドキュメント
$ LANG=en_US man ls ⇒ 英語のドキュメント
$ man ls ⇒ また日本語のドキュメント

>2つ目のコマンドはどのような法則に基づいて、シェル変数の設定部分と、実行するコマンドの部分が切り分けて解釈されたのでしょうか?

コマンドの先頭から、リダイレクト指定を除いて、代入の形式が続く限り、それを環境変数の設定と見なします。
set -k とすると、先頭でなくても代入の形式であれば環境変数の設定になります。

$ man ls LANG=en_US ⇒ ls と LANG=en_US はmanの引数。LANG=en_USというマニュアルはないというエラーメッセージが出る
$ set -k
$ man ls LANG=en_US ⇒ 英語のマニュアル
$ set +k
    • good
    • 1
この回答へのお礼

いつもお世話になっております。丁寧に教えていただきありがとうございます。いつか私もコミュニティに貢献できる日が来ればと考えています。

お礼日時:2013/01/02 23:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!