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

unixの初心者です、以下のecho -eの¥がどう機能するか?
混乱して困っています。
3と4が同じになるのに、5と6が異なるのはなぜなんでしょう?
そもそも¥て何をするものなんでしょうか?-eと¥がくっつくと
やたら難しくなって困っています。
1, echo -e "hello\tthere" →  hello there
2, echo -e hello\tthere   hellotthere
3, echo -e "hello\\tthere"   hello there
4, echo -e hello\\tthere   hello there
5, echo -e "hello\\\tthere"   hello\there
6, echo -e hello\\\tthere   hello there
よろしくお教えください。

A 回答 (4件)

「よろしくお教えください。

」という件について、個別に回答していませんでしたので、追記しました。

なお、下記の件はすべて 回答No.1 の参照サイトに書いてあります。
よく読んでみてください。

1. helloとthereを水平タブで区切って表示したい。
この記述例だけが正解です。

2. スクリプト記述ミスなので論外です。
シェルプログラムは無効なバックスラッシュを無視したので、保証できない結果が表示されている。

3. スクリプト記述ミスをシェルプログラムが救済した。
最初のバックスラッシュを無効として、それ以外は救済した。

4. (3)と同じように、スクリプト記述ミスをシェルプログラムが救済した。

5. 結果は hello\tthere と合計12文字になるはずなので、質問者はタイプミス(11文字)していると思われる。
シェルプログラムはスクリプト記述通りに正しく判定し、バックスラッシュを1文字表示した。
つまり、バックスラッシュを3つ続けて記述しているので、「両側のバックスラッシュで囲んだメタ文字を表示しなさい」という指定になり、結果表示は2番目のバックスラッシュが1文字だけ表示される。
後ろに続いている文字は、単なる文字列( tthere という6文字の文字列)として表示されている。

ーーー以上です。
    • good
    • 0

シェルの構文解析時に解釈される\と、echoコマンド処理時に解釈される\があるのに注意ですかね。

\自体は同じですが、構文解析時に消費(?)されてコマンド処理に渡らないものと、構文解析を通り抜けてコマンドに渡るもの。

bashの構文解析時の\文字処理は以下の通りです。
(1) " " の中
\\ は \ に、\" は " に、それ以外の文字 c について \c は \c のまま。

(2) ' ' の中
\ はそのまま。

(3) " " や ' ' の外
\\ は \ に、それ以外の文字 c について \c は c に。c が空白文字でもパラメータ区切りにはならない。あと、行末の \ は行の連結に。

以上を適用すると、
>1, echo -e "hello\tthere" →  hello there
echo に渡るのは hello\tthere で、\t をecho -eがタブにする

>2, echo -e hello\tthere   hellotthere
echo に渡るのは hellotthere で、echo -e はそのまま出す

>3, echo -e "hello\\tthere"   hello there
echo に渡るのは hello\tthere で、\t をecho -eがタブにする

>4, echo -e hello\\tthere   hello there
echo に渡るのは、hello\tthere で、\t をecho -eがタブにする

>5, echo -e "hello\\\tthere"   hello\there
echo に渡るのは、hello\\tthere で、\\ をecho -eが\にする

>6, echo -e hello\\\tthere   hello there
echo に渡るのは、hello\tthere で、\t をecho -eがタブにする

動作が書いた人の意図通りであるかどうかをさておくと、すべて正しい記述です。
    • good
    • 0
この回答へのお礼

ありがとうございました。
よく覚えて使ってみます。

お礼日時:2009/11/14 01:21

6. について書き忘れていました。



6. スクリプト記述ミスをシェルプログラムが救済した。
-e 指定があるのでシェルプログラムはエスケープシーケンスを優先した。
(最初の2文字のバックスラッシュは無効として、エスケープシーケンスを採用した)

5. と 6. の違いについては、つぎのようになります。
5. は正しいスクリプト記述ー>正しく処理実行ー>正しい結果表示(指示通りの結果表示)。
6. は正しくないスクリプト記述ー>誤りを救済して実行ー>救済結果を表示。

---以上です。
    • good
    • 0
この回答へのお礼

何度もありがとうございました。
基本がわかってなかったので、これから
勉強するときに役に立つと思います。

お礼日時:2009/11/14 01:24

下記サイト参照。


シェル・スクリプト・リファンレス
メタ文字の取り扱い
http://itpro.nikkeibp.co.jp/article/COLUMN/20060 …
    • good
    • 0

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