• ベストアンサー

リダイレクションについて

「<<」とはヒアドキュメントと呼ぶらしいのですが・・・。 まだまだ初心者ですので簡単なことしか分からないのです。 二行以上にわたって文字のある、abc.txtというファイルをつくりたいんですが、以下のように実行してもうまくできませんでした。 bash$ echo abc << abc.txt また、ヒアリダイレクションの利用価値というものはあるのでしょうか? perlの場合のヒアリダイレクションの利便性は良く分かったのですが・・・。 すいません。どうか、お答えをよろしくお願いします。

  • ryo-3
  • お礼率64% (146/226)

質問者が選んだベストアンサー

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.6

この回答中, 行頭の$はプロンプトなので,入力しなくていいです. [ENTER]は [[] [E] [N] [T] [E] [R] []] と順に打つのではなく, Enter キーを押してください. ------------------------------------------------------------ まず, $ echo "script no test" [ENTER] script no test $ echo "script wo sitteiruto benri desu" [ENTER] script wo sitteiruto benri desu $ pwd [ENTER] honyarara $ を実行してみてください.いや,実行しなくてもいいですけど. 例えば,このような作業を何度も行う場合,50文字ぐらい(かな)を 毎回打つのは面倒くさいですよね. そこでスクリプトが登場です.e2pという名前のファイルを作って, 内容を ------------------------------------------------------------ #!/bin/bash echo "script no test" echo "script wo sitteiruto benri desu" pwd ------------------------------------------------------------ としてください.(実は名前はe2pじゃなくて何でもいいですが.) 次に,chmod コマンドを実行してください. $ chmod u+x e2p [ENTER] $ そして, $ ./e2p [ENTER] script no test script wo sitteiruto benri desu honyarara $ このように,あらかじめコマンドを並べたファイルを作っておくことで, そのファイル名だけでコマンド群を実行することができます. ------------------------------------------------------------ どうでしょうか.

ryo-3
質問者

お礼

ありがとうございました! 実際に学校では実行することができませんでした…↓ あさってころunix系OSを買ってきて家のに入れるつもりです! そのときはまたよろしくお願いします。

その他の回答 (5)

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.5

スクリプト内で $ cat >abc.txt > a > b > c > (Ctrl+C) と同様の機能が欲しい場合は,ヒアドキュメントの機能がないと うまくいきません. (いちおうecho でもできるが.) cat >abc.txt a b c (Ctrl+C) というスクリプトを作って実行したらどうなるか試してください. 最終的には aを実行しようとしたときに, aというコマンドが見つからないというエラーになります. よくわからなければ, cat >abc.txt <<-- a b c -- というスクリプトを作って実行した場合と比べてください. 「……というスクリプトを作って実行し‥‥」 の意味がわからなければ,別途質問するか, 補足してください. ------------------------------------------------------------ 大抵のプログラムは Ctrl-C で強制終了できますが,あくまでも強制終了であり, 全てのプログラムでうまく止まるとは限りません. (例えば,  プログラム内部で,多量の入力を扱うために,  入力をバッファーにためておき,  ある程度入力がたまったときに処理をするようになっていたばあい,  Ctrl+Cでは,バッファーにたまっている分は処理されずに終了します.) ちなみに入力の終了は,UNIXでは [Ctrl]+[D] MS-DOSでは [Ctrl]+[Z] [ENTER] です.

ryo-3
質問者

補足

Ctrl+Dでした、すいません・・・↓ やはり、スクリプトをつくって実行してくださいの意味が分かりませんでした。 素人ですいません・・・。 教えていただけたら幸いです。

  • AYA_papa
  • ベストアンサー率0% (0/1)
回答No.4

入力の終端を"END"とすると、 (例1) $ cat > abc.txt << END > テキストの入力 ←1行目テキストを入力 > ・・・ ←n行目テキストを入力 > END ←ENDで,入力終了 (例2) $ cat << END > abc.txt > テキストの入力 ←1行目テキストを入力 > ・・・ ←n行目テキストを入力 > END ←ENDで,入力終了 $ cat abc.txt ←作成されているかを確認 以上のいずれでも出来ると思います。

ryo-3
質問者

補足

すいません。書き方が足りなかったですね。 もう一つ疑問に思ったのが $cat >abc.txt >a >b >c とやっていき「Ctrl+C」を押せば任意に終了させることができるのですが、これはbashだけのものであり、共通してのコマンドがヒアドキュメンとなのでしょうか? おそくなりすいません・・・。

  • kayu24
  • ベストアンサー率0% (0/2)
回答No.3

bashはよくわからないのですが、少なくともcshの場合はこんな使い方ができます。 ::メニュー形式のシェルを作りたい! #!/bin/csh cat << EOF #-------------------------# 1. 10代 2. 20代 3. 30代 #-------------------------# EOF echo -n "年齢は? >" set innum=$<    ・    ・ 変数に入力された値で処理を行う    ・    ・ つまり、echoを連発しなくてもよい! ついでに、"#"も認識できます。 飽くまでも使い方の一例ですが。

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

利用価値: たとえば、あるテキストファイルを元にして、HTMLファイルを作る スクリプトを作りたい場合、mkhtml.cshとファイルを以下のようにつくり、 ---------- #!/bin/csh -f cat << END_OF_HERE_DOC <html> <head> <title>$1</title> </head> <body> <pre> END_OF_HERE_DOC cat $1 cat <<END_OF_HERE_DOC </pre> </body> </html> END_OF_HERE_DOC ---------- csh mkhtml もとのテキストファイル.txt > result.html のようにすれば、もとのファイルのはじめと終わりに 数行づつ追加されたファイルができます。 ヒアドキュメントがなければ、あらかじめ追加するファイルを作っておき、 cat txt1 $1 txt2 のようにするか、 「1行ずつ echo で表示」する必要があります。

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

bash$ cat << HERE > abc.txt 一行目 2行目 なんでもかける HERE bash$ cat abc.txt 一行目 2行目 なんでもかける bash$ この実行例のようになります。 bash$ cat abc.txt 以下は、実際どのようなファイルができているか確かめているだけです。

関連するQ&A

  • shellスクリプトに複数の引数を渡したい

    shellスクリプトに複数の引数を渡したいと考えています。 下記のようなperlスクリプトを兼ねる事でやりたいことは達成できました。 これをシェルスクリプトだけでやろうとしていて、ハマってしまい、やり方がわからなかったので、質問しています。 ・echo.shの中身 $ cat echo.sh echo $1 $2 ・imglist.plの中身 $ cat imglist.pl my@imglist= `ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} 2>1&`; foreach(@imglist){ my@name=split /\./,$_; system("bash ./echo.sh $name[0] $name[1]"); } ・実行すると、無事echo.shに引数が2つ渡る。 $ perl imglist.pl abc1 jpg abc10 png abc11 png abc2 jpg abc3 jpg これをシェルのみでやろうとして、はまってしまいました。 以下は、パイプ処理等を使ったりしてやってみたのですが出来ませんでした。 ・awkでファイル名と拡張子に分解し、パイプで渡そうとしても何故か渡らない・・ $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}'| bash ./echo.sh ・ファイルに一旦保存し、catコマンドでパイプで渡しても駄目 $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}' > imglist.txt $ cat imglist.txt | bash ./echo.sh ・echoコマンドを使ってパイプで渡しても駄目 $ echo `cat imglist.txt` |bash ./echo.sh ・for.shというファイルを作成し、for構文でimglist.txtの中身を渡すと引数が一つずつしか渡らない $ cat for.sh for id in $(cat imglist.txt); do echo $id done $ bash for.sh tile1 jpg tile10 jpg どうやれば、コマンドライン上やシェルスクリプトだけで、今回はファイル名と拡張子という形で複数行からなる2つの引数を渡すことができますでしょうか

    • ベストアンサー
    • Perl
  • Linuxでの別プロセス起動について

    コマンド置換を使用した場合に、シェル自体が子プロセスとして立ち上がる場合とそうでない場合があります。 具体的には以下のような場合です。 【パターン1】 コマンド置換内の処理が1行の場合は子プロセスが発生しない abc=`pstree` echo $abc -sshd-+-sshd---bash---pstree (該当部分だけを切り出しています) 【パターン2】 コマンド置換内で処理が2行以上ある場合は子プロセスが発生する abc=`echo; pstree` echo $abc -sshd-+-sshd---bash---bash---pstree (該当部分だけを切り出しています) パイプを使用した場合には子プロセスとして処理が実行されることは認識しているのですが、コマンド置換の場合も子プロセスとして実行されるのが普通なのでしょうか? だとすれば、パターン1のように処理が1行だけの場合には子プロセスとして立ち上がらない理由は何でしょうか? このあたりに詳しい方、ご教示いただければ幸いです。

  • コマンド履歴が~/.bash_historyに保存されない

    通常、コマンド履歴は~/.bash_historyに保存されるはずだと思っていましたが保存されていないようです、原因がわかりません。 助けて頂けませんでしょうか [root@localhost sub]# su - hoge [hoge@localhost ~]$ ls Desktop i a testdir ec.txt [hoge@localhost ~]$ tail ~/.bash_history set|grep abc abc=`date` set|grep abc echo $abc abc=1 echo $abc abc=$(date) echo $abc alias exit

  • PerlからPythonについて

    以下のPerlをPythonで書くとどうなるのでしょうか? pythonのヒアドキュメントと<DATA>, chompの動作の置き換えが知りたいです。 ヒアドキュメントは"""や'''で可能?と思いますが、ヒアドキュメントを1行づつ取り出す方法がわかりません。 use strict; # <-- Pythonの厳格化?の警告方法も知りたいです。 while(<DATA>){ chomp; print "$_\n"; } exit; __DATA__ abc de f ghi 参考になるサイトや本をご存じの方教えてください。

    • ベストアンサー
    • Perl
  • 検索してあった数を調べる 初心者です。

    perlを使ってabc.txtの中に 1999 という文字列が何個あるか調べるプログラムはどのように書けばよろしのでしょうか?@を使ったりしてやってみたのですが、これでは 1999 が含まれる行の数しか出し方がわかりませんでした。 ご教授ください。お願い致します。

    • ベストアンサー
    • Perl
  • シェルスクリプトについて

    bangou.txtには ▲ 123123 123123 100000 ▲ ▲ というように数値が入っています。(▲は空白ですが改行コードがはいってます) この場合、1行目と3行目を比較するスクリプトを作りたいと思って 色々調べて以下のようなスクリプトを作ってみましたけどうまく動きません。 #!/bin/bash for iii in `sed -n '1p' bangou.txt` do jjj=`sed -n '2p' bangou.txt` kkk=`sed -n '3p' bangou.txt` #declare -i $kkk if [ "$kkk" = "$iii" ] then echo "$iii" else echo "$kkk" fi done どこか基本的なところで間違えているのかと思うのですが初心者なので よくわかりません。 わかる方がいらっしゃったら教えていただけないでしょうか。

  • 連想配列を含むヒアドキュメントの書き方

    連想配列を含むヒアドキュメントの書き方を教えてください。 以下のコードならうまく行きました。 -(1)-------------------------- $SS = $_SERVER['PHP_SELF']; $html_txt = <<<EOT ($SS) EOT; echo $html_txt; ------------------------------ これを一時的な変数を使わずに以下のようなコードで実行したいです。 -(2)-------------------------- $html_txt = <<<EOT ($_SERVER['PHP_SELF']) EOT; echo $html_txt; ------------------------------ これを実行すると # Parse error: syntax error, unexpected '"', # expecting T_STRING or T_VARIABLE or T_NUM_STRING in … というエラーが出てしまいます。 最悪、(1)でもいいと思っています。しかし(2)のようなケースでもできてもいいのではないかと思うのですが、エスケープを入れたり「$_SERVER["PHP_SELF"]」などとクォーテーションを変更したりしてもうまく行きません。 質問は以下です ・(2)のような記述はPHPでは不可能なのでしょうか? ・もし可能なら(1)の何が悪いのか、どうすればうまく行くのかを教えてください よろしくお願いします。

    • ベストアンサー
    • PHP
  • 行頭と行末に文字追加

    文字変換がうまくいきません。 sedとawkもしくはperlを使ってなんとかならないでしょうか? 行の行頭と行末を " で囲みたいのですが。 ------test.txt----- abc cde fgh hijk lm nopq rstu vwx y z ------test.txt---- 以下のように。 "abc cde fgh" "hijk lm" "nopq rstu vwx y z" よろしくお願いします。

    • ベストアンサー
    • Perl
  • バッチコマンドの「set」で入力した内容をファイルに出力する場合の問題点

    DOSのバッチコマンドで以下のようなものを作りました。 set /p abc= echo %abc% > nyuryoku.txt 画面から入力した文字を「nyuryoku.txt」に出力することを意図したものですが、2つ問題が出ています。 (1)何も入力しないと、「nyuryoku.txt」に「ECHO は <ON> です。」と出力されてしまいます。 これは「」(つまりNULL値)を出力できないでしょうか。 (2)「123」を入力すると「nyuryoku.txt」に「123 」と出力されてしまします。つまり最後に半角スペースがついてしまいます。 これは「123」を出力できないでしょうか。 すみません。おわかりになる方がいたら教えてください。

  • awkでファイルから読み込んだ値を、演算させるにはどうしたら良いですか

    awkでファイルから読み込んだ値を、演算させるにはどうしたら良いですか。 ファイル(hoge.txt)の内容は、次の通り(全4行) 123 456 50 20 これを、bashスクリプトで計算させます。 FF=`cat hoge.txt | awk 'BEGIN {x=$2;printf ("%s, %s", (148+x*0.05), x);}'` echo "答え = ${FF}" このときの$2の値は、50です。但し、文字列として扱われているようです。 xの値を、数値として代入され、四則演算をさせるにはどうしたら良いですか? 以上、よろしくお願いします。