2012-07-25 58 views
0

所以我有一個客戶端和一個服務器Java程序。客戶端使用Java processbuilder來執行腳本,但我的問題是用戶輸入需要傳遞給bash腳本的信息。因此,本質上,我需要知道如何將三個不同的字符串發送給由bash腳本讀取的三個不同變量。這個腳本正在複製一個文件,所以我寧願不用java創建一個txt文件,並讓腳本讀取文件。我也想要一種能夠在OS X和Windows上運行的方式,因此歡迎進行改進。我目前在Ubuntu上使用Java 7。從Java傳遞字符串到bash腳本

這裏是什麼,我試圖做一個片段: 的.java

Scanner bob = new Scanner(System.in); 
    String workingDirectory = new String(System.getProperty("user.dir")); 
    File tempDir = new File(workingDirectory); 
    String script = new String(workingDirectory + "/copyjava.sh"); 

    System.out.print("Designate the location of the file: "); 
    String loc = bob.next(); 
    System.out.print("Type the name of the file w/ extension: "); 
    String name = bob.next(); 
    System.out.print("What is the location of THIS file? "); //I know there is a way to do this automagically but I can't remember how... 
    String wkspace = bob.next(); 
    ProcessBuilder pb = new ProcessBuilder(script, loc, name, wkspace); 
    pb.start(); 
    File myFile = new File (name); 

腳本:

read loc 

read name 

read wkspace 

cd $LOC 

cp $name $wkspace 

回答

1

您的shell腳本存在問題。 read命令從stdin讀取,但是您將輸入作爲參數傳遞。你也在改變loc變量的情況。 shell中的變量區分大小寫。你的腳本更改爲以下:

#!/bin/sh 
loc=$1 
name=$2 
wkspace=$3 
cd "$loc" || { printf 'failed to cd to %s\n' "$loc" ; exit 1; } 
cp "$name" "$wkspace" || { printf 'failed to copy %s\n' "$name" ; exit 1; } 

在一個側面說明,你不應該需要調用用不同的語言只是爲了拷貝文件外部腳本。你應該在java中實現這個。在java中實現這個功能也會爲你的代碼提供你想要的平臺獨立性。

+0

我剛剛開始編寫腳本,所以這對我來說都是新的。你將如何在Java中實現這個?我找不到在工作目錄以外的目錄中複製文件的任何內容。 – Mrcheese123 2012-07-25 23:51:47

+0

SO搜索顯示此:http://stackoverflow.com/questions/106770/standard-concise-way-to-copy-a-file-in-java – jordanm 2012-07-25 23:56:01

0

你是通過你的ARGS在命令行上而是在從標準輸入讀你腳本。如何改變你的腳本:

cd $1 

cp $2 $3 
0

我看不出有任何的客戶端/服務器交互,但讓我們專注於真正重要的:您正在傳遞參數給腳本,但你的腳本試圖從閱讀標準輸入。

解決您的問題修改你的腳本如下:

#!/bin/sh 
LOC=$1 
name=$2 
wkspace=$3 

cd $LOC 

cp $name $wkspace 

看看在documentation瞭解更多詳情。

但是沒有做任何事情,真的需要一個系統特定的腳本文件。複製文件的最佳方法是使用Java提供的自己的機制,然後您不必擔心底層操作系統。

如果您繼續使用腳本,那麼您需要另一個用於Windows系統的腳本,然後根據os.name系統屬性的值決定應運行哪個腳本。

+0

這不是你如何在shell中分配一個變量。這不是Perl或PHP。 – jordanm 2012-07-25 23:40:00

+0

感謝提醒,和平。 – 2012-07-25 23:41:07