将字符串从Java传递给bash脚本

时间:2012-07-25 23:30:27

标签: java linux shell unix scripting

所以我有一个客户端和一个服务器Java程序。客户端使用Java processbuilder来执行脚本但我的问题是用户输入需要传递给bash脚本的信息。所以,基本上,我需要知道如何将三个不同的字符串发送到bash脚本正在读取的三个不同变量。这个脚本正在复制一个文件,所以我宁愿不用java创建一个txt文件,让脚本读取文件。我还想要一种能够在OS X和Windows上运行的方法,以便进行改进。我目前在Ubuntu上使用Java 7。

以下是我要做的事情的片段: 的.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

3 个答案:

答案 0 :(得分: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中实现它也将为您的代码提供所需的平台独立性。

答案 1 :(得分:0)

您正在命令行传递args但是从脚本中的stdin读取。如何将脚本更改为:

cd $1

cp $2 $3

答案 2 :(得分:0)

我没有看到任何客户端/服务器交互,但让我们关注真正重要的事情:您正在将参数传递给脚本,但您的脚本正在尝试从标准输入中读取它们。

要解决您的问题,请按以下步骤修改脚本:

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

cd $LOC

cp $name $wkspace

查看documentation了解更多详情。

但是没有做任何真正需要系统特定脚本文件的事情。复制文件的最佳方法是使用Java提供的自己的机制,然后您不必担心底层操作系统。

如果继续使用该脚本,那么您将需要另一个用于Windows系统的脚本,然后根据os.name系统属性的值决定应该运行哪个脚本。

相关问题