• 締切済み

c shellスクリプト中のエスケープとコメントアウト

c shellスクリプトで改行コード(文末の"\n")をエスケープしたい場合に関して伺いたく思っています。以下のように「my_command」というコマンドに、幾つかオプションをつけるような場合、改行コードをエスケープして見やすく記述したいような場合を想定しています。 ある行をコメントアウトするとき(下の例の "<-")、その行の末尾に"\"が必要なようです。 しかし、これがどうしてコメント行の最後をエスケープしないといけないのか、あるいは、どうしてコメントが有効に働くのか、不思議に思っています。 SHELLがどのような処理手順をとっているから"\"があると有効に処理されるのか、教えていただけませんでしょうか? 【推測1】 [改行コードまで読む] --> [式を評価] ... この処理だと > my_command -opt_a hoge_a # -opt_b hoge_b_tmp -opt_b hoge_b が評価され、正しくオプションが渡せない。。。 ※ 一行づつ式を評価をしながら"\n"があるまで読みこみ、"\n"を発見したら子シェルを起動する、という手順で正しいのでしょうか? 【例】 -------------------------------- #! /bin/csh -f my_command -opt_a hoge_a \ # -opt_b hoge_b_tmp \ <-- -opt_b hoge_b --------------------------------

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

基本的には #1 の通り「\+改行」を空白に置き換えるという処理をしてるから, かな. この場合って -opt_b は my_command に渡されましたっけ? もしそうなら Cシェルで「コメントの処理」と「継続行の処理」が変なところで混ざってる可能性が高いです. Cシェルはわりと「い~かげん」なところがあるので, インタラクティブに使うならともかくスクリプトを書くためには使わない方がいいと思うけど....

tk_1980024
質問者

補足

コメント有難うございます。 > この場合って -opt_b は my_command に渡されましたっけ? はい、-opt_b hoge_b はきちんと渡っています。 CSHって変なんでしょうか?

  • eroermine
  • ベストアンサー率18% (83/444)
回答No.1

行末に \ があると次の行に連結されます。 これはUNIX系の習慣。C言語のマクロなど一行にかけない場合 行末の\ で次の行と連結します。

tk_1980024
質問者

補足

レス有難うございます。「連結される」ということはシェルは、上述【例】を以下のように解釈しているのですよね? my_command -opt_a hoge_a # -opt_b hoge_b_tmp -opt_b hoge_b これは"#"という変な引数があるとしてmy_commandに怒られてしまいそうなのです。。

関連するQ&A

  • コメントアウトされたエスケープシーケンスについて

    Java初心者です。 コメントアウトされた中のエスケープシーケンスの使い方について質問があります。 class sample{ public static void main(String args[]){ System.out.println("16進数 :\u0001") // System.out.println("16真数 :\ugggg") } } 上記のようなソースコードがあった場合、 System.out.println("16進数 :\u0001") については、当然Unicodeの16進数範囲内なので、 コンパイルエラーにならないのですが、 コメントアウトされている行 // System.out.println("16真数 :\ugggg") については、 コンパイルエラーになります。 エラーメッセージは「エスケープシーケンスが不正です。」 コメントアウトされているので、この行は無視されるものだと思っていたのですが、コンパイルエラーになるのは何故でしょうか。 どうかご教授願います。

  • Shellスクリプトについて

    趣味で自宅にubuntuを入れて、Linuxの本を片手にもって勉強している学生です それでshellスクリプトでテストの結果を入力したら自動的にA.B.Cと認識するプログラムを作ったんですけど $ ./test ./test: line 4: echoPlease input your record: command not found 12 ./test: line 7: case12in: command not found ./test: line 8: syntax error near unexpected token `)' ./test: line 8: `100 | 99 | 98 | 97 | 96 | 95 | 94 | 93 | 92 | 91| 90 ) echo"A";;' なぜコマンドが見つからないのかわかりません ちなみにプログラムは #!/bin/sh echo"Please input your record" read record case"$record"in 100|99|98|97|96|95|94|93|92|91|90) echo"A";; 89|88|87|86|85|84|83|82|81|80) echo"B";; 79|78|77|76|75|74|73|72|71|70) echo"C";; 69|68|67|66|65|64|63|62|61|60) echo"D";; 59|58|57|56|55|54|53|52|51|50) echo"E";; 49|48|47|46|45|44|43|42|41|40) echo"F";; 39|38|37|36|35|34|33|32|31|30) echo"G";; 29|28|27|26|25|24|23|22|21|20) echo"H";; 19|18|17|16|15|14|13|12|11|10) echo"I";; 9|8|7|6|5|4|3|2|1|0) echo"J";; *)echo"sorry,answer not recognized";; esac exit もしどこか間違っていたら教えてください

  • Shell.ApplicationでのIEオブジェ

    目的のタブページのオブジェクトを取得することに成功したのですが、質問があります。 コードはVBSで書いています。 Dim objIE Set Shell=Wscript.CreateObject("Shell.Application") for each tmp in Shell.Windows if TypeName(tmp.document)="HTMLDocument" then'HTMLDocumentかつ if tmp.document.title="Google" then'そのページのタイトルが「Google」なら set objIE=tmp'代入 end if end if Next if objIE="" then WScript.Echo("目的のページが表示されてないっぽいです") WScript.Quit end if 'この時点で、objIEがその目的のページでのオブジェクト ここで、 objIE.alert("hoge")とできないのはどうしてなのでしょうか? alertはjavascriptの関数?だからですか?? でも、objIE.document.write("hoge")で、documentオブジェクトが使えるのはどうしてなんですか? documentオブジェクトはjavascirptのオブジェクトじゃないんですか? それともう1つ、上記コードの場合ですが、JSの場合 Shell.Windows.item(0)というので参照?できるっぽいですが、itemというメソッドはjavascirptだけのものなのでしょうか?vbsでは使えないのですか?何故なんですか?同じcomオブジェクトを参照してるんじゃないんですか?(?) どのオブジェクトがどれで、どのメソッドがどれなのかわからなくなります。 あと1つだけ! 上記コードでの、tmp.documentとはなんなのでしょうか?HTMLDocumentとは・・w 頭が混乱してます。どなたか回答よろしくお願いいたします。

  • C言語のコンパイルエラーなんですが、どこが悪いのかがわからない。

     作成したソースプログラムを、コンパイルしようとすると次のようなエラーが出ます。 「ファイル名:19:waring: unknow escape sequence: `\' followed by char code 0×89」  確かに、19行めに¥nの改行コードを打ちましたがそれがいけないのかな?しかし、その理由もわからん。  というか、上の考えがあっているのかすら分からない。どうか教えてください。ちなみに、19行目のソースプログラムは 「printf("よし!十円チョコかえるわ。今すぐレッツゴー。\n");」 です。よろしくお願いします。

  • 最適なスクリプト言語は何でしょうか

    文字処理に強いスクリプト言語を 学習を始めようとおもうのですが、 以下のような作業をする時に、 最適なスクリプト言語は何でしょうか? (作業内容) ソースコードの中から関数の引数と名前を 取得することをしたいです。 1) A(A1,A2) 2) A(B1, B2) 1)では、1行に収まっているので、  取得するのは容易なのですが、 2)では、改行があるので、少しだけ  困難があります。

  • PHPのエスケープシーケンスについての質問です。

    PHPのエスケープシーケンスについての質問です。 下記のコードで改行コードを<br>に置換し、結果を画面に出力しました。 $text = "あいうえお\\nかきくけこ\nさしすせそ"; $text = str_replace("\n", "<br>" , $text); echo $text; 実行結果は下記になりました。 あいうえお\\nかきくけこ さしすせそ 私の予想では、\\nが\<br>に置換され、下記になるかと思いました。 あいうえお\ かきくけこ さしすせそ なぜ\\nは\<br>に置換されず、そのままだったのでしょうか?

    • ベストアンサー
    • PHP
  • 【php】改行にエスケープ文字が入る

    phpで  $_GET['a'] = stripslashes($_GET['a']); $_GET['a'] = mysql_real_escape_string($_GET['a']); $_GET['a'] → インサート と途中に stripslashes mysql_real_escape_string をはさんでから GETやPOSTを取得してるんですが改行が改行コードに変わってしまいます。 例えば質問フォームとかで  ---------------------------------------- 質問内容 ---------------------------------------- なんたら かんたら  ↓ サブミット ---------------------------------------- 投稿確認 ---------------------------------------- なんたら\n\rかんたら みたいなかんじです。 一旦文字コードをEUCにかえてから mysql_real_escape_stringを挟んだりしたりもしてみてますが 改行が改行コードになってしまいます。

    • ベストアンサー
    • PHP
  • #define中の#のエスケープ

    #defineを使ってincludeディレクトリを切り替えようと考えました。 ------- #define DIR_NAME "DIR_A" //#define DIR_NAME "DIR_B" #define ALL_INCLUDE(x) \ #include x##"/aaa.h" \ #include x##"/bbb.h" ALL_INCLUDE(DIR_NAME) ------- ですが#includeの#記号が文字列化の演算子と判断されてしまいます。 \#includeの場合、今度は改行のエスケープになってしまいます。 どうにかして#をエスケープさせることはできるでしょうか?

  • PHPとHTMLをまとめてコメントアウトしたいので

    HTMLの中にPHPが混じっているコードを、上から下まで一気にコメントアウトしたいのですが、どうしたらいいでしょうか? PHPとHTMLに分け、それぞれコメントアウトしていくしかないのでしょうか? それだともの凄く見難くなるのですが…… 後、HTML複数行コメントアウトの中に、PHPコメントアウトを書いてもいいのでしょうか? 例) ----------------------------------------------------- ・今日の天気予報<br> ・一覧 … <?php echo array_sum($hoge); ?> 全国<br>  <table>  <tr id="Theading" >  <th id="Theading"> Yahoo</th>  <th id="Theading"> livedoor</th>  <th id="Theading"> excite</th>  </tr>  <?php foreach($hoge as $k => $v){ ?>  <tr id="Tvalues">  <td><?php echo $piyo; ?></td>  <td><?php echo $k; ?></td>  <td><?php echo $v; ?></td>  <?php $piyo++; ?>  </tr>  <?php } ?>  </table> <br><br> -----------------------------------------------------

    • ベストアンサー
    • PHP
  • C言語に直して下さい

    VisualC++で円周率を求めるプログラムなのだそうですが、 自分はC言語しか使ったことがないため、よく分かりません。 Cでコンパイルできるように直していただけないでしょうか。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 21 #define K 100000 void add(unsigned long a[],unsigned long b[]) { int c = 0, tmp; for (int i = N - 1; i > -1; i--) { tmp = a[i] + b[i] + c; a[i] = tmp % K; c = tmp / K; } } void sub(unsigned long a[],unsigned long b[]) { int c = 0, x = 0; for (int i = N - 1; i > -1 ; i--) { x = c; if (a[i] < b[i] + x ) c = 1; else c = 0; a[i] = c * K + a[i] - b[i] - x; } } void div(unsigned long a[], unsigned long x) { int c=0, tmp; if (x >= K) { printf("Div Error\n"); getchar(); exit(1); return; } for (int i = 0; i < N ; i++) { tmp = (a[i] + c * K) / x; c = (a[i] + c * K) % x; a[i] = tmp; } } void clear(unsigned long a[]) { memset(a,0x00,sizeof(a)*N); } void set(unsigned long a[], unsigned long b[]) { memcpy(a,b,sizeof(a)*N); } void set(unsigned long a[], unsigned long b) { if (b<K) { clear(a); a[0]=b; } } int _tmain(int argc, _TCHAR* argv[]) { unsigned long pai[N], fn[N], gn[N], tmp1[N], tmp2[N]; int i; unsigned long n; clear(pai); clear(fn); clear(gn); clear(tmp1); clear(tmp2); set(fn, 16*5); set(gn, 4*239); for(n=0;n<40000;n++) { div(fn, 25); div(gn, 239); div(gn, 239); set(tmp1, fn); div(tmp1, 2*n+1); set(tmp2, gn); div(tmp2, 2*n+1); if (n%2==0) { add(pai, tmp1); sub(pai, tmp2); }else{ add(pai, tmp2); sub(pai, tmp1); } } for (i=0;i<N;i++) { printf("%5lu ", pai[i]); } getchar(); return 0; }

専門家に質問してみよう