2

Java から 3 つのパラメーターを受け取る bash スクリプトを実行しようとしています。以下は、コマンド ラインを作成するコードです。

CommandLine command = new CommandLine(/bin/bash);
command.addArgument(ScriptName);
command.addArgument(Param1);
command.addArgument(Param2);
command.addArgument(Param3);

空でないパラメーターが渡された場合、これは魅力のように機能します。しかし、パラメータの 1 つが空であると想定されているように機能しません (つまり、"")

詳しく言うと、場合によっては Param2 = "". これで、bash スクリプトが実行されると、Param2 = "" と見なされる代わりに、Param2 = Param 3 (値) および Param3 = undefined が使用されます。

これが起こらないようにするにはどうすればよいですか?

編集: Param1、Param2 & Param3 は、実際には bash スクリプトに渡されるファイル名です。ここで、Param1 => File1、Param2 => File 2 & Param3 => 出力ファイル

Bash スクリプトは、実際にはファイル 1 でいくつかのメトリックを呼び出して生成し、それを出力ファイルに保存しています。メトリックを生成する場合、生成されるメトリックには 2 つのカテゴリがあります。

  1. 絶対の
  2. 相対的

絶対はファイル 1 で生成され、相対はファイル 1 とファイル 2 を比較した後に生成されます。bash スクリプトでは、ファイル 2 が引数として渡されない場合、相対メトリックを生成しないという条件があります。

これがデザインになったものです。ここで、比較用のファイル 2 が存在しない場合に問題が発生します。この場合、絶対メトリックを生成し、相対メトリックを除外します。

しかし、今私に起こっていることは、Param 3 (つまり、出力ファイル) が File 2 (完全に望ましくない) と見なされ、相対メトリックの生成がトスになることです。

Runtime.getRuntime().exec を使用すると、引用することでこれを行うことができました。ie /bin/bash Script Param1 "" Param3 これは魅力的に機能しました。

コードを削減し、クロスプラットフォームのサポートを強化しようとして、commons-exec を導入したところ、問題が発生し始めました。

それで、私の質問はまだです、Param2の値を空にして、commons-execコマンドラインを使用してスクリプトをbashに渡すにはどうすればよいですか?

4

2 に答える 2

4

見積もりを自分で処理してみることができます。

if (Param.isEmpty()) {
    command.addArgument("\"\"", false);
} else {
    command.addArgument(Param2);
}

あるいは単に:

command.addArgument("\"" + Param2 + "\"", false);

私はそれを使ったことがありませんが、学びます[:-)

更新:これは私のために働いたものです(サルマン):

CommandLine command = new CommandLine(/bin/bash);
command.addArgument(ScriptName);
command.addArgument(Param1);

if (Param2== null || Param2.trim().length() == 0) {
    command.addArgument("\"\"", false);
} else {
    command.addArgument(Param2);
}

command.addArgument(Param3);
于 2011-03-31T11:43:28.117 に答える
2

評価を開始する前に引数の長さを確認してください

これが私の頭の上からの何かです:

public static void main(String[] args) {
        if (args.length != 3) {
            //print usage message throw exception or whatever System.exit afterwards
        }
        //individual agrument evaluation
        for (int i = 0; i < args.length; i++) {
            //if length less then one, or whatever you prefer
            if(args[i].length() < 1){
                //print usage message
                //throw exception exit the program 
            }
        }
    }
于 2011-03-31T10:19:11.570 に答える