2013-07-30 17 views
7

私はオブジェクト指向プログラミングに慣れています。さて、Linux経由でUNIXのbashスクリプトを学び始めました。unix bashスクリプトでコードを整理する

私には私のUNIXスクリプトがあります。私はそれを "モジュール"または "more"、 "ls"などと同様のプログラムに分解し、パイプを使ってすべてのプログラムをリンクさせたいと思っていました。たとえば、「some input」myProg1 | myProg2 | myProg3。

私は自分のコードを整理し、1つのスクリプトではなく、もっときれいに見せたいと思っています。また、テストと開発も簡単にできます。

これは、特に初心者の方が可能ですか?

+2

'source file'を使用すると、そのファイルのコードが利用可能になります。 – hetepeperfan

+0

スクリプトやその機能を知らなくても、ちょっと難解です。一般的な答えは "おそらく"です。スクリプトの機能をモジュールに分割することが理にかなっているかどうかによって異なります。 'ls'、' more'などのようなプログラムは、それぞれ独立した関数として、そしてパイプされた機能として意味を成す明確で明確な目的を持っています。あなたのスクリプトの部分がその本質であるかどうかを判断する必要があります。答えが「そうです、それをモジュールに分割することは可能であり、意味があります」 – lurker

+0

@mbratch - 私の望むモジュールのほとんどは、実際には私の仕事に特有の汎用プログラムではありません。私は利便性と開発とテストの容易さを求めていました。 – bashboy

答えて

5

あなたは例えば、ではbashでの別名の使用状況を見てみると、bashrcにまたは容易にコマンドを実行するようになりますbashrcに

によって呼び出された別々のファイルのいずれかに格納することができ、いくつかのものがあります。..

take a look here for expanding commands into aliases (simple aliases are easy) 

また、機能の意味を理解するために(あなたのコード内の関数を使用しての中に上記のリンクのホームフォルダ内のbashスクリプトの多くを見ることができるthis siteを閲覧:)はるかに良い例を持っている...

を見てみましょうここにはそうだ私は、何かがbashのためにあまりにも厄介取得するために開始した場合、あなたは常にすべてのLANGのPerl/Javaのを書いて、あなたのbashスクリプト内からこれを呼び出すことができます例えばので、bashのあるものは、その柔軟性であるスクリプト pipe tail output into another script

に尾をパイプ、とにかくここにすべてのパイプが助けになるかもしれ何か、なぜ

わからない...その出力をキャプチャして、何か他の操作を行います。

./example.sh 20 
function one starts with 20 
In function 2 20 + 10 = 30 
Function three returns 10 + 10 = 40 
------------------------------------------------ 

------------------------------------------------ 
Local function variables global: 
Result2: 30 - Result3: 40 - value2: 10 - value1: 20 

スクリプト:

example.sh 01 shared.sh

function one() { 
     value1=$input 
     echo "function one starts with $value1" 
     two; 
} 

function two() { 
     value2=10; 
     result2=$(expr $value1 + $value2) 
     echo "In function 2 $value1 + $value2 = $result2" 
     three; 
} 
function three() { 
     local value3=10; 
     result3=$(expr $value2 + $result2;) 
     echo "Function three returns $value2 + $value3 = $result3" 
} 
#!/bin/bash 

input=$1; 

source ./shared.sh 

one 

echo "------------------------------------------------" 



echo "------------------------------------------------" 
echo "Local function variables global:" 
echo "Result2: $result2 - Result3: $result3 - value2: $value2 - value1: $value1" 

私はあなたが実際に機能することができ意味パイプを考えると、各機能が相互に呼び出すことができます...そして、あなたは、スクリプトにそれが機能を通過する価値を与えます..

bashは限り前に呼び出される関数は、変数それによって呼び出される次の関数がそれを再利用することができ、またはそれは

メインプログラムから呼び出すことができるを有するように、周りの値を渡すことについてかなり柔軟です210

また、私はupvoteのための

E2Aのおかげで、同じ機能を実行するために別のスクリプトによって供給することが可能な機能を分割、私はまた、このリンクあり

http://tldp.org/LDP/abs/html/sample-bashrc.html

を含めることにしました再利用される素晴らしい.bashrcです。パイピングを必要とするような毎日の繰り返しコマンドを単純化する方法についてのいくつかの洞察を与える多くの機能を備えています。エイリアスはすべてあなたのために書かれます。 。

+0

ありがとうございますが、私はbashですべてをやりたいです。 – bashboy

+0

可能であれば、bashスクリプトは、他の人がコンパイルしたファイル、つまりncやlsof、psなどを使って、他の人がコンパイルしたCファイルであることを知っておく必要があります。あなたのプログラムは別の言語から... – Vahid

+0

例えばncやncatはhttpsやssl接続では動かないでしょう。これにはelinksやリンクを使うことができます。もし見つからなければ、perl/javaや選択して、自分のbashスクリプト内から呼び出す – Vahid

2

あなたは1つのことを行うことができます。 複雑さを軽減するために、Cプログラムをヘッダファイルとソースファイルに分けることができるように、bashスクリプトをヘッダーとメインスクリプトの2つのスクリプトに分けることができますが、いくつかの違いがあります。

ヘッダーファイル - 定義されているすべての共通変数と、メインスクリプトで使用される関数定義が含まれます。

あなたのスクリプト - これには関数呼び出しとその他のロジックのみが含まれます。ヘッダに宣言されているすべての関数と変数を取得できるようにするには、スクリプト内で "source <"ヘッダファイルパス ">"あなたのスクリプト。

0

シェルスクリプトには、UNIX上の他のプログラムと同様に標準入出力があり、パイプで使用できます。後で他のコマンドでパイプで使用できるので、スクリプトを分割することは良い解決策です。

私は次のように私のbashのプロジェクトを整理:

  • 各コマンドは
  • 再利用可能な機能のみの機能を持つだけで古典的なスクリプトですライブラリファイルに保存されている独自のファイルに入れています
  • すべてのファイルが同じディレクトリにあるため、コマンドはライブラリを見つけることができます$(dirname $0)/library
  • 環境変数として別のファイルに保存されます

機能を明確にするために、関数とメインプログラム間の通信にグローバル変数を使用しないでください。

私が用意し、次の部品とスクリプトのテンプレートを準備しますsource

  • チェックパラメータ
  • 機能付きsource
  • ロードライブラリと名前と著作権
  • 読む構成と

    • ヘッダー尋ねられた場合、またはパラメータが間違っている場合に呼び出されるヘルプを表示する

    私の最善のアドバイスは:常にそれを必要とする次の人は、ヘルプ機能を書く...あなた自身です!

    プロジェクトをインストールするには、すべてのファイルをコピーし、設定ファイルで設定する内容を説明するだけです。

  • +0

    私はあなたがここでコマンドと機能の間に作っている/組織/区別を理解しているかどうかわかりません。 。それは階層関係ですか?すなわちライブラリ内の関数はコマンドで使用され、ユーザスクリプトはコマンドを使用して間接的にしかそれらのライブラリ関数を使用しませんか? –

    +0

    私は単純なことをする関数を書くことを試みるので、コマンドの再利用可能なビルディングブロックと見ることができます。過去のプロジェクトでは、次のようなものに使用しました。 - ログとエラー管理 - データベース接続とクエリの実行 - データローダーやスケジューラのようなその他の基本機能 –

    関連する問題