• ベストアンサー

python、perlをbashのスクリプトに混在させて書く方法

perlからshellを呼ぶにはsystemなどの方法がありますが、1つのスクリプトの中に上記の3つないしは他のインタプリタ言語を混在させるように書く簡便な方法はありますか? もちろん、それぞれ別にスクリプトを作成しておいてそれを相互に呼び出して使うことはできるのですが、awkをシェル上で使う時のように、他のプログラムで数行で書ける内容を少しだけ使って、その場でパイプなりで値を受け渡ししたいです。 もとのスクリプトはbashが良いですが。他の2つでも構いません。 当方の環境はcygwinとあまり使っていないubuntuです。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

awk '{....}' のように書きたいということであれば、perl -e で、 perl -e 'print 1+2*3;' とかです。 awkのように、標準入力からファイルを読み込んで、行単位で処理したければ、 ls -l | perl -pe 'chop; $_ = "<$_>\n";' とか、 ls -l | perl -ne 'chop; print "<$_>\n";' とか。 -pe と -ne の違いは、最後に自動的に print $_; するかどうかです。awk的に使いたければ、-ne ですね。 コマンドラインオプションについては、入門書の初めの方に書いてあるかと思いますよ。

latifolius
質問者

お礼

ありがとうございます。うまくいきました。 コマンドとキーワードがわかればオプションなどは自分で調べられそうです。 なかなかこういう細かい小手先のことが見つからず(探し方が下手なのか?)、大変助かりました。

関連するQ&A

  • bashスクリプトの中の rubyプログラムでシェル変数を参照したい

    Windows XP で Cygwin, ruby を使っています。 bashスクリプトの中の ruby プログラムで シェル変数を参照したいのですが どうしたらよいでしょうか? 例: abc = "qwerty" ruby -e ' #ここでシェル変数 abc を参照したい '

  • shのシェルスクリプトの演算方法について・・・

    bashのシェルスクリプトについてもお聞きしたのですが、 その方法では演算ができない!ということになってしまいました・・・ こういうちょこっとしたところが違うのが嫌です・・・↓ bashの場合は ---------- bash$ a=1 bash$ a=$(( $a + 1 )) bash$ echo $a 2 ---------- となったのですが、shではエラーが出てしまいました・・・ また、shのスクリプトもbashのスクリプトもシェルスクリプトと呼ぶのでしょうか?

  • bashスクリプトでの三乗根計算

    bashスクリプト内にて三乗根の計算をしたいのですが、 fotran, c言語のプログラムを使用しないで済む方法は あるのでしょうか? bc -l, awk, letなどの使用(または他のunixコマンド)で できればと考えています。 よろしくお願いいたします。

  • Cygwinのシェルスクリプトから、DOSのバッチファイルを起動できる?

    Cygwin(bash)で使うシェルスクリプトの中から、MS-DOSのバッチファイル(.bat)を起動できるでしょうか? 実験では不可能( Cygwin(bash)からcommand not found と言われてしまう)でした。が、もしかしたら裏技的にできる方法をご存知の方がいらっしゃるかと思い、質問させて頂きました。 以上どうぞ宜しくお願い致します。

  • 環境を区別して、動作を分岐させる方法 シェルスクリプト

    bashのシェルスクリプトで、Windows(cygwin)とLinuxの環境を区別して、動作を分岐させる方法が知りたいです。 #!/bin/bash #Windows(cygwin)の場合 ls win/ #linuxの場合 ls linux/ #freebsdの場合 ls freebsd/ #MacOSXの場合 ls mac/

  • 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
  • bashのスクリプト内で、パイプ入力を受け取るには?

    bashのスクリプトで質問です。 hoge_command 何らかのコマンド bashtest.sh bashスクリプト とあるときに、 hoge_command | bashtest.sh のようにパイプでの入力をスクリプト内で受け取る方法はありますか? たとえばperlであれば、 while(<STDIN>){ .... のようにして受け取ることができると思いますが、 bashでは、どのようにすればよいでしょう。 また、bashtest.sh で、引数無しのときにUsageを出すようにしてあった場合にうまく動作しないので、 hoge_command | bashtest.sh - のように記述して受け取る方法はあるでしょうか? (同じくperlなら、 if( $ARGV[0] eq "-" ){ while(<STDIN>){ .... のように書いて逃げるところと思います。 初歩的なことで恐縮ですが、よろしくお願いします。

  • シェルスクリプト+perl

    シェルスクリプト中で1行だけperlを利用したいと思っています。 しかしシェルスクリプトで利用している変数をperlに持っていく方法が分からず悩んでいます。 ---------------------- #!/ban/bash hoge="hogehoge" perl -e ・・・ ←この中で$hogeを利用したい ---------------------- perlですべて書き直せばできるのですが、1行のためだけに、すべてを修正するのもどうかと思いましたので質問させていただきました。 もしご存知の方いらっしゃいましたらお教えください。

  • bashでローカルエコーをオフにする方法

    簡単なシェルスクリプトで、 echo -n "Enter password: " read などと書く場合、入力が画面に表示されないよう、ローカルエコーをオフにするにはどうすればよいでしょう? C言語などを使うやり方ではなくて、シェルスクリプト中で実現できる方法がありましたら教えてください。 シェルは、bash-2.05です。

  • 【シェルスクリプト】各ディレクトリで一番大きな数字

    シェルスクリプト(Ubuntu bash)にて 以下の様なディレクトリ構成で各ディレクトリで一番数字の大きなファイルのパスを取得したいです。 data --0001 ----1 ----2 ----3 --0002 ----1 ----2 --0003 ----1 結果としてはこのように表示したいのですが、良い方法はありませんでしょうか。 data/0001/3 data/0002/2 data/0003/1